asn1.cc (4456B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include <cstddef> 6 #include <cstdint> 7 8 #include "certt.h" 9 #include "keythi.h" 10 #include "secasn1.h" 11 #include "secdert.h" 12 13 #include "asn1/mutators.h" 14 #include "base/mutate.h" 15 16 const SEC_ASN1Template *templates[] = {CERT_AttributeTemplate, 17 CERT_CertExtensionTemplate, 18 CERT_CertificateRequestTemplate, 19 CERT_CertificateTemplate, 20 CERT_IssuerAndSNTemplate, 21 CERT_NameTemplate, 22 CERT_PublicKeyAndChallengeTemplate, 23 CERT_RDNTemplate, 24 CERT_SequenceOfCertExtensionTemplate, 25 CERT_SetOfAttributeTemplate, 26 CERT_SignedDataTemplate, 27 CERT_SubjectPublicKeyInfoTemplate, 28 CERT_TimeChoiceTemplate, 29 CERT_ValidityTemplate, 30 SEC_AnyTemplate, 31 SEC_BitStringTemplate, 32 SEC_BMPStringTemplate, 33 SEC_BooleanTemplate, 34 SEC_CertSequenceTemplate, 35 SEC_EnumeratedTemplate, 36 SEC_GeneralizedTimeTemplate, 37 SEC_IA5StringTemplate, 38 SEC_IntegerTemplate, 39 SEC_NullTemplate, 40 SEC_ObjectIDTemplate, 41 SEC_OctetStringTemplate, 42 SEC_PointerToAnyTemplate, 43 SEC_PointerToEnumeratedTemplate, 44 SEC_PointerToGeneralizedTimeTemplate, 45 SEC_PointerToOctetStringTemplate, 46 SEC_PrintableStringTemplate, 47 SEC_SetOfAnyTemplate, 48 SEC_SetOfEnumeratedTemplate, 49 SEC_SequenceOfAnyTemplate, 50 SEC_SequenceOfObjectIDTemplate, 51 SEC_SignedCertificateTemplate, 52 SEC_SkipTemplate, 53 SEC_T61StringTemplate, 54 SEC_UniversalStringTemplate, 55 SEC_UTCTimeTemplate, 56 SEC_UTF8StringTemplate, 57 SEC_VisibleStringTemplate, 58 SECKEY_DHParamKeyTemplate, 59 SECKEY_DHPublicKeyTemplate, 60 SECKEY_DSAPrivateKeyExportTemplate, 61 SECKEY_DSAPublicKeyTemplate, 62 SECKEY_PQGParamsTemplate, 63 SECKEY_PrivateKeyInfoTemplate, 64 SECKEY_RSAPSSParamsTemplate, 65 SECKEY_RSAPublicKeyTemplate, 66 SECOID_AlgorithmIDTemplate}; 67 68 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 69 static char *dest[2048]; 70 71 PORTCheapArenaPool pool; 72 PORT_InitCheapArena(&pool, DER_DEFAULT_CHUNKSIZE); 73 74 for (auto tpl : templates) { 75 memset(dest, 0, sizeof(dest)); 76 77 SECItem buf = {siBuffer, (unsigned char *)data, (unsigned int)size}; 78 (void)SEC_ASN1DecodeItem(&pool.arena, dest, tpl, &buf); 79 } 80 81 PORT_DestroyCheapArena(&pool); 82 83 return 0; 84 } 85 86 extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, 87 size_t max_size, unsigned int seed) { 88 return CustomMutate( 89 Mutators({ASN1Mutators::FlipConstructed, ASN1Mutators::ChangeType}), data, 90 size, max_size, seed); 91 }