@@ -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+ }
0 commit comments