@@ -47,8 +47,8 @@ BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs,
47
47
_noSNI(false ),
48
48
_ecChainLen(0 )
49
49
{
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 ;
52
52
53
53
_ecKey.curve = 0 ;
54
54
_ecKey.x = NULL ;
@@ -290,6 +290,53 @@ void BearSSLClient::setEccSlot(int ecc508KeySlot, const char cert[])
290
290
}
291
291
}
292
292
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
+
293
340
int BearSSLClient::errorCode ()
294
341
{
295
342
return br_ssl_engine_last_error (&_sc.eng );
@@ -421,3 +468,12 @@ void BearSSLClient::clientAppendCert(void *ctx, const void *data, size_t len)
421
468
memcpy (&c->_ecCert [0 ].data [c->_ecCert [0 ].data_len ], data, len);
422
469
c->_ecCert [0 ].data_len += len;
423
470
}
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