Skip to content

Commit e985450

Browse files
authored
Merge pull request #44 from HarringayMakerSpace/jitp-parent
Enable setting client certificate parent
2 parents 20db745 + 96cba2d commit e985450

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/BearSSLClient.cpp

+58-2
Original file line numberDiff line numberDiff line change
@@ -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+
293340
int 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+

src/BearSSLClient.h

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class BearSSLClient : public Client {
8383

8484
void setEccSlot(int ecc508KeySlot, const byte cert[], int certLength);
8585
void setEccSlot(int ecc508KeySlot, const char cert[]);
86+
void setEccCertParent(const char cert[]);
8687

8788
int errorCode();
8889

@@ -91,6 +92,7 @@ class BearSSLClient : public Client {
9192
static int clientRead(void *ctx, unsigned char *buf, size_t len);
9293
static int clientWrite(void *ctx, const unsigned char *buf, size_t len);
9394
static void clientAppendCert(void *ctx, const void *data, size_t len);
95+
static void parentAppendCert(void *ctx, const void *data, size_t len);
9496

9597
private:
9698
Client* _client;

0 commit comments

Comments
 (0)