Skip to content

Commit 449cd13

Browse files
fix for sanity checks on serial input
1 parent 350706d commit 449cd13

3 files changed

Lines changed: 83 additions & 3 deletions

File tree

src/x509.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15924,13 +15924,13 @@ int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s)
1592415924

1592515925
/* WOLFSSL_ASN1_INTEGER has type | size | data
1592615926
* Sanity check that the data is actually in ASN format */
15927-
if (s->length < 3 && s->data[0] != ASN_INTEGER &&
15927+
if (s->length < 3 || s->data[0] != ASN_INTEGER ||
1592815928
s->data[1] != s->length - 2) {
1592915929
return WOLFSSL_FAILURE;
1593015930
}
1593115931
XMEMCPY(x509->serial, s->data + 2, s->length - 2);
1593215932
x509->serialSz = s->length - 2;
15933-
x509->serial[s->length] = 0;
15933+
x509->serial[x509->serialSz] = 0;
1593415934

1593515935
return WOLFSSL_SUCCESS;
1593615936
}

tests/api/test_x509.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,81 @@ int test_x509_GetCAByAKID(void)
243243
#endif /* WOLFSSL_AKID_NAME */
244244
return EXPECT_RESULT();
245245
}
246+
247+
int test_X509_set_serialNumber(void)
248+
{
249+
EXPECT_DECLS;
250+
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
251+
WOLFSSL_X509* x509 = NULL;
252+
WOLFSSL_ASN1_INTEGER* s = NULL;
253+
254+
ExpectNotNull(x509 = wolfSSL_X509_new());
255+
ExpectNotNull(s = wolfSSL_ASN1_INTEGER_new());
256+
257+
/* --- invalid inputs that must be rejected --- */
258+
259+
/* NULL x509 */
260+
ExpectIntEQ(X509_set_serialNumber(NULL, s), WOLFSSL_FAILURE);
261+
/* NULL s */
262+
ExpectIntEQ(X509_set_serialNumber(x509, NULL), WOLFSSL_FAILURE);
263+
264+
if (s != NULL) {
265+
/* length == 0: too short */
266+
s->length = 0;
267+
s->data[0] = ASN_INTEGER;
268+
s->data[1] = 0;
269+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
270+
WOLFSSL_FAILURE);
271+
272+
/* length == 1: still too short */
273+
s->length = 1;
274+
s->data[0] = ASN_INTEGER;
275+
s->data[1] = 0;
276+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
277+
WOLFSSL_FAILURE);
278+
279+
/* length == 2: still rejected — the guard requires length >= 3 */
280+
s->length = 2;
281+
s->data[0] = ASN_INTEGER;
282+
s->data[1] = 0;
283+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
284+
WOLFSSL_FAILURE);
285+
286+
/* wrong type byte */
287+
s->length = 4;
288+
s->data[0] = 0x00; /* not ASN_INTEGER */
289+
s->data[1] = 2; /* length field */
290+
s->data[2] = 0x01;
291+
s->data[3] = 0x02;
292+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
293+
WOLFSSL_FAILURE);
294+
295+
/* mismatched length byte (data[1] != s->length - 2) */
296+
s->length = 4;
297+
s->data[0] = ASN_INTEGER;
298+
s->data[1] = 99; /* claims 99 bytes but s->length - 2 == 2 */
299+
s->data[2] = 0x01;
300+
s->data[3] = 0x02;
301+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
302+
WOLFSSL_FAILURE);
303+
304+
/* --- valid two-byte serial number --- */
305+
s->length = 4;
306+
s->data[0] = ASN_INTEGER;
307+
s->data[1] = 2;
308+
s->data[2] = 0x01;
309+
s->data[3] = 0x02;
310+
ExpectIntEQ(wolfSSL_X509_set_serialNumber(x509, s),
311+
WOLFSSL_SUCCESS);
312+
ExpectIntEQ(x509->serialSz, 2);
313+
/* NUL terminator must be placed right after the copied data */
314+
ExpectIntEQ(x509->serial[x509->serialSz], 0);
315+
ExpectIntEQ(x509->serial[0], 0x01);
316+
ExpectIntEQ(x509->serial[1], 0x02);
317+
}
318+
319+
wolfSSL_ASN1_INTEGER_free(s);
320+
wolfSSL_X509_free(x509);
321+
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
322+
return EXPECT_RESULT();
323+
}

tests/api/test_x509.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424

2525
int test_x509_rfc2818_verification_callback(void);
2626
int test_x509_GetCAByAKID(void);
27+
int test_X509_set_serialNumber(void);
2728

2829
#define TEST_X509_DECLS \
2930
TEST_DECL_GROUP("x509", test_x509_rfc2818_verification_callback), \
30-
TEST_DECL_GROUP("x509", test_x509_GetCAByAKID)
31+
TEST_DECL_GROUP("x509", test_x509_GetCAByAKID), \
32+
TEST_DECL_GROUP("x509", test_X509_set_serialNumber)
3133

3234
#endif /* WOLFCRYPT_TEST_X509_H */

0 commit comments

Comments
 (0)