27
27
28
28
#include " SSLClient/SSLClientParameters.h"
29
29
30
- struct ssl_pem_decode_state
30
+ struct ssl_pem_decode_state
31
31
{
32
32
std::vector<char >* vect;
33
33
size_t index = 0 ;
34
34
};
35
35
36
- static void ssl_pem_decode_callback (void *dest_ctx, const void *src, size_t len)
36
+ static void ssl_pem_decode_callback (void *dest_ctx, const void *src, size_t len)
37
37
{
38
38
ssl_pem_decode_state* ctx = static_cast <ssl_pem_decode_state*>(dest_ctx);
39
-
40
- for (size_t i = 0 ; i < len; i++)
39
+
40
+ for (size_t i = 0 ; i < len; i++)
41
41
ctx->vect ->emplace_back (static_cast <const char *>(src)[i]);
42
-
42
+
43
43
// update index
44
44
ctx->index += len;
45
45
}
@@ -52,50 +52,55 @@ static void ssl_pem_decode_callback(void *dest_ctx, const void *src, size_t len)
52
52
@param len Number of characters to process, MUST include a whole certificate.
53
53
@return A vector of bytes representing the certificate in DER format.
54
54
*/
55
- static std::vector<char > make_vector_pem (const char * data, const size_t len)
55
+ static std::vector<char > make_vector_pem (const char * data, const size_t len)
56
56
{
57
- if (data == nullptr || len < 80 )
57
+ if (data == nullptr || len < 80 )
58
58
return {};
59
-
59
+
60
60
// initialize the bearssl PEM context
61
61
br_pem_decoder_context pctx;
62
+
62
63
br_pem_decoder_init (&pctx);
63
-
64
+
64
65
// create a temporary vector
65
66
std::vector<char > temp;
67
+
66
68
// initialize the DER storage context
67
69
ssl_pem_decode_state state;
70
+
68
71
state.vect = &temp;
72
+
69
73
state.index = 0 ;
70
-
74
+
71
75
// set the byte reciever
72
76
br_pem_decoder_setdest (&pctx, &ssl_pem_decode_callback, &state);
73
-
77
+
74
78
// start decoding!
75
79
int br_state = 0 ;
80
+
76
81
size_t index = 0 ;
77
-
78
- do
82
+
83
+ do
79
84
{
80
85
index += br_pem_decoder_push (&pctx, static_cast <const void *>(&data[index]), len - index);
81
86
br_state = br_pem_decoder_event (&pctx);
82
-
87
+
83
88
// if we found the begining object, reserve the vector based on the remaining relavent bytes
84
- if (br_state == BR_PEM_BEGIN_OBJ)
89
+ if (br_state == BR_PEM_BEGIN_OBJ)
85
90
{
86
91
// 22 = five dashes for header and footer + four newlines - character difference between `BEGIN` and `END`
87
92
const size_t relavant_bytes_base64 = len - (2 * strlen (br_pem_decoder_name (&pctx)) + 22 );
88
93
temp.reserve (relavant_bytes_base64 * 3 / 4 );
89
94
}
90
95
} while (br_state != BR_PEM_ERROR && br_state != BR_PEM_END_OBJ && len != index);
91
-
96
+
92
97
// error check
93
- if (br_state == BR_PEM_ERROR)
98
+ if (br_state == BR_PEM_ERROR)
94
99
{
95
100
// set data to error
96
101
temp.clear ();
97
102
}
98
-
103
+
99
104
// else we're good!
100
105
return temp;
101
106
}
@@ -108,30 +113,33 @@ static std::vector<char> make_vector_pem(const char* data, const size_t len)
108
113
@returns context used by BearSSL to store information about the keys. You can
109
114
use the br_skey_* family of APIs to access information from this context.
110
115
*/
111
- static br_skey_decoder_context make_key_from_der (const std::vector<char >& der)
116
+ static br_skey_decoder_context make_key_from_der (const std::vector<char >& der)
112
117
{
113
118
br_skey_decoder_context out;
114
119
br_skey_decoder_init (&out);
115
120
br_skey_decoder_push (&out, der.data (), der.size ());
116
-
121
+
117
122
return out;
118
123
}
119
124
120
125
/* See SSLClientParams.h */
121
- SSLClientParameters::SSLClientParameters (const char * cert, const size_t cert_len, const char * key, const size_t key_len, bool is_der)
126
+ SSLClientParameters::SSLClientParameters (const char * cert, const size_t cert_len, const char * key, const size_t key_len,
127
+ bool is_der)
122
128
: m_cert(is_der ? std::vector<char >(cert, cert + cert_len) : make_vector_pem(cert, cert_len))
123
129
, m_cert_struct{ const_cast <unsigned char *>(reinterpret_cast <const unsigned char *>(m_cert.data ())), m_cert.size () }
124
- , m_key_struct( make_key_from_der( is_der ? std::vector<char >(key, key + key_len) : make_vector_pem(key, key_len) ) )
130
+ , m_key_struct( make_key_from_der( is_der ? std::vector<char >(key, key + key_len) : make_vector_pem(key, key_len) ) )
125
131
{}
126
132
127
133
/* See SSLClientParams.h */
128
- SSLClientParameters SSLClientParameters::fromPEM (const char * cert_pem, const size_t cert_len, const char * key_pem, const size_t key_len)
134
+ SSLClientParameters SSLClientParameters::fromPEM (const char * cert_pem, const size_t cert_len, const char * key_pem,
135
+ const size_t key_len)
129
136
{
130
137
return SSLClientParameters (cert_pem, cert_len, key_pem, key_len, false );
131
138
}
132
139
133
140
/* See SSLClientParams.h */
134
- SSLClientParameters SSLClientParameters::fromDER (const char * cert_der, const size_t cert_len, const char * key_der, const size_t key_len)
141
+ SSLClientParameters SSLClientParameters::fromDER (const char * cert_der, const size_t cert_len, const char * key_der,
142
+ const size_t key_len)
135
143
{
136
144
return SSLClientParameters (cert_der, cert_len, key_der, key_len, true );
137
145
}
0 commit comments