quickder.cc (2798B)
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 #include <vector> 8 9 #include "certt.h" 10 #include "keythi.h" 11 #include "secdert.h" 12 #include "secport.h" 13 14 #include "asn1/mutators.h" 15 #include "base/mutate.h" 16 17 const std::vector<const SEC_ASN1Template *> templates = { 18 CERT_AttributeTemplate, 19 CERT_CertExtensionTemplate, 20 CERT_CertificateRequestTemplate, 21 CERT_CertificateTemplate, 22 CERT_CrlTemplate, 23 CERT_IssuerAndSNTemplate, 24 CERT_NameTemplate, 25 CERT_PublicKeyAndChallengeTemplate, 26 CERT_RDNTemplate, 27 CERT_SequenceOfCertExtensionTemplate, 28 CERT_SetOfAttributeTemplate, 29 CERT_SetOfSignedCrlTemplate, 30 CERT_SignedCrlTemplate, 31 CERT_SignedDataTemplate, 32 CERT_SubjectPublicKeyInfoTemplate, 33 CERT_TimeChoiceTemplate, 34 CERT_ValidityTemplate, 35 SEC_AnyTemplate, 36 SEC_BitStringTemplate, 37 SEC_BMPStringTemplate, 38 SEC_BooleanTemplate, 39 SEC_CertSequenceTemplate, 40 SEC_EnumeratedTemplate, 41 SEC_GeneralizedTimeTemplate, 42 SEC_IA5StringTemplate, 43 SEC_IntegerTemplate, 44 SEC_NullTemplate, 45 SEC_ObjectIDTemplate, 46 SEC_OctetStringTemplate, 47 SEC_PointerToAnyTemplate, 48 SEC_PointerToEnumeratedTemplate, 49 SEC_PointerToGeneralizedTimeTemplate, 50 SEC_PointerToOctetStringTemplate, 51 SEC_PrintableStringTemplate, 52 SEC_SetOfAnyTemplate, 53 SEC_SetOfEnumeratedTemplate, 54 SEC_SequenceOfAnyTemplate, 55 SEC_SequenceOfObjectIDTemplate, 56 SEC_SignedCertificateTemplate, 57 SEC_SkipTemplate, 58 SEC_T61StringTemplate, 59 SEC_UniversalStringTemplate, 60 SEC_UTCTimeTemplate, 61 SEC_UTF8StringTemplate, 62 SEC_VisibleStringTemplate, 63 SECKEY_DHParamKeyTemplate, 64 SECKEY_DHPublicKeyTemplate, 65 SECKEY_DSAPrivateKeyExportTemplate, 66 SECKEY_DSAPublicKeyTemplate, 67 SECKEY_PQGParamsTemplate, 68 SECKEY_PrivateKeyInfoTemplate, 69 SECKEY_RSAPSSParamsTemplate, 70 SECKEY_RSAPublicKeyTemplate, 71 SECOID_AlgorithmIDTemplate}; 72 73 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { 74 static char *dest[2048]; 75 76 PORTCheapArenaPool pool; 77 PORT_InitCheapArena(&pool, DER_DEFAULT_CHUNKSIZE); 78 79 for (auto tpl : templates) { 80 SECItem buf = {siBuffer, (unsigned char *)data, (unsigned int)size}; 81 (void)SEC_QuickDERDecodeItem(&pool.arena, dest, tpl, &buf); 82 } 83 84 PORT_DestroyCheapArena(&pool); 85 86 return 0; 87 } 88 89 extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, 90 size_t max_size, unsigned int seed) { 91 return CustomMutate( 92 Mutators({ASN1Mutators::FlipConstructed, ASN1Mutators::ChangeType}), data, 93 size, max_size, seed); 94 }