@@ -132,21 +132,37 @@ static bssl::UniquePtr<EVP_PKEY> MakeKeyPairForSelfSignedCert() {
132
132
133
133
static bssl::UniquePtr<X509> MakeSelfSignedCert (EVP_PKEY *evp_pkey,
134
134
const int valid_days) {
135
+ uint64_t serial;
135
136
bssl::UniquePtr<X509> x509 (X509_new ());
136
- uint32_t serial;
137
- RAND_bytes (reinterpret_cast <uint8_t *>(&serial), sizeof (serial));
138
- ASN1_INTEGER_set (X509_get_serialNumber (x509.get ()), serial >> 1 );
139
- X509_gmtime_adj (X509_get_notBefore (x509.get ()), 0 );
140
- X509_gmtime_adj (X509_get_notAfter (x509.get ()), 60 * 60 * 24 * valid_days);
141
-
142
- X509_NAME* subject = X509_get_subject_name (x509.get ());
143
- X509_NAME_add_entry_by_txt (subject, " C" , MBSTRING_ASC,
144
- reinterpret_cast <const uint8_t *>(" US" ), -1 , -1 ,
145
- 0 );
146
- X509_NAME_add_entry_by_txt (subject, " O" , MBSTRING_ASC,
147
- reinterpret_cast <const uint8_t *>(" BoringSSL" ), -1 ,
148
- -1 , 0 );
149
- X509_set_issuer_name (x509.get (), subject);
137
+ if (!x509 || //
138
+ !X509_set_version (x509.get (), X509_VERSION_3) ||
139
+ !RAND_bytes (reinterpret_cast <uint8_t *>(&serial), sizeof (serial)) ||
140
+ !ASN1_INTEGER_set_uint64 (X509_get_serialNumber (x509.get ()), serial) ||
141
+ !X509_gmtime_adj (X509_get_notBefore (x509.get ()), 0 ) ||
142
+ !X509_gmtime_adj (X509_get_notAfter (x509.get ()),
143
+ 60 * 60 * 24 * valid_days)) {
144
+ return nullptr ;
145
+ }
146
+
147
+ X509_NAME *subject = X509_get_subject_name (x509.get ());
148
+ if (!X509_NAME_add_entry_by_txt (subject, " C" , MBSTRING_ASC,
149
+ reinterpret_cast <const uint8_t *>(" US" ), -1 ,
150
+ -1 , 0 ) ||
151
+ !X509_NAME_add_entry_by_txt (
152
+ subject, " O" , MBSTRING_ASC,
153
+ reinterpret_cast <const uint8_t *>(" BoringSSL" ), -1 , -1 , 0 ) ||
154
+ !X509_set_issuer_name (x509.get (), subject)) {
155
+ return nullptr ;
156
+ }
157
+
158
+ // macOS requires an explicit EKU extension.
159
+ bssl::UniquePtr<STACK_OF (ASN1_OBJECT)> ekus (sk_ASN1_OBJECT_new_null ());
160
+ if (!ekus ||
161
+ !sk_ASN1_OBJECT_push (ekus.get (), OBJ_nid2obj (NID_server_auth)) ||
162
+ !X509_add1_ext_i2d (x509.get (), NID_ext_key_usage, ekus.get (), /* crit=*/ 1 ,
163
+ /* flags=*/ 0 )) {
164
+ return nullptr ;
165
+ }
150
166
151
167
if (!X509_set_pubkey (x509.get (), evp_pkey)) {
152
168
fprintf (stderr, " Failed to set public key.\n " );
0 commit comments