@@ -47,8 +47,8 @@ BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs,
4747  _noSNI(false ),
4848  _ecChainLen(0 )
4949{
50-   _ecVrfy = br_ecdsa_vrfy_asn1_get_default () ;
51-   _ecSign = br_ecdsa_sign_asn1_get_default () ;
50+   _ecVrfy = eccX08_vrfy_asn1 ;
51+   _ecSign = eccX08_sign_asn1 ;
5252
5353  _ecKey.curve  = 0 ;
5454  _ecKey.x  = NULL ;
@@ -290,6 +290,53 @@ void BearSSLClient::setEccSlot(int ecc508KeySlot, const char cert[])
290290  }
291291}
292292
293+ void  BearSSLClient::setEccCertParent (const  char  cert[])
294+ {
295+   //  try to decode the cert
296+   br_pem_decoder_context pemDecoder;
297+ 
298+   size_t  certLen = strlen (cert);
299+ 
300+   //  free old data
301+   if  (_ecCertDynamic && _ecCert[1 ].data ) {
302+     free (_ecCert[1 ].data );
303+     _ecCert[1 ].data  = NULL ;
304+   }
305+ 
306+   //  assume the decoded cert is 3/4 the length of the input
307+   _ecCert[1 ].data  = (unsigned  char *)malloc (((certLen * 3 ) + 3 ) / 4 );
308+   _ecCert[1 ].data_len  = 0 ;
309+   _ecChainLen = 2 ;
310+ 
311+   br_pem_decoder_init (&pemDecoder);
312+ 
313+   while  (certLen) {
314+     size_t  len = br_pem_decoder_push (&pemDecoder, cert, certLen);
315+ 
316+     cert += len;
317+     certLen -= len;
318+ 
319+     switch  (br_pem_decoder_event (&pemDecoder)) {
320+       case  BR_PEM_BEGIN_OBJ:
321+         br_pem_decoder_setdest (&pemDecoder, BearSSLClient::parentAppendCert, this );
322+         break ;
323+ 
324+       case  BR_PEM_END_OBJ:
325+         if  (_ecCert[1 ].data_len ) {
326+           //  done
327+           _ecCertDynamic = true ;
328+           return ;
329+         }
330+         break ;
331+ 
332+       case  BR_PEM_ERROR:
333+         //  failure
334+         free (_ecCert[1 ].data );
335+         return ;
336+     }
337+   }
338+ }
339+ 
293340int  BearSSLClient::errorCode ()
294341{
295342  return  br_ssl_engine_last_error (&_sc.eng );
@@ -421,3 +468,12 @@ void BearSSLClient::clientAppendCert(void *ctx, const void *data, size_t len)
421468  memcpy (&c->_ecCert [0 ].data [c->_ecCert [0 ].data_len ], data, len);
422469  c->_ecCert [0 ].data_len  += len;
423470}
471+ 
472+ void  BearSSLClient::parentAppendCert (void  *ctx, const  void  *data, size_t  len)
473+ {
474+   BearSSLClient* c = (BearSSLClient*)ctx;
475+ 
476+   memcpy (&c->_ecCert [1 ].data [c->_ecCert [1 ].data_len ], data, len);
477+   c->_ecCert [1 ].data_len  += len;
478+ }
479+ 
0 commit comments