@@ -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