Path: blob/main/crypto/krb5/src/tests/fuzzing/fuzz_asn.c
34914 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* tests/fuzzing/fuzz_asn.c - fuzzing harness for ASN.1 encoding/decoding */2/*3* Copyright (C) 2024 by Arjun. All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8*9* * Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11*12* * Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in14* the documentation and/or other materials provided with the15* distribution.16*17* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS20* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE21* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,22* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES23* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR24* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,26* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)27* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED28* OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031#include "autoconf.h"32#include <k5-spake.h>3334#define kMinInputLength 235#define kMaxInputLength 20483637extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);3839static void40free_cred_enc_part_whole(krb5_context ctx, krb5_cred_enc_part *val)41{42krb5_free_cred_enc_part(ctx, val);43free(val);44}4546static void47free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val)48{49if (val == NULL)50return;51free(val->kerb_message.data);52free(val->target_domain.data);53free(val);54}5556#define FUZZ_ASAN(type, encoder, decoder, freefn) do { \57type *v; \58krb5_data *data_out = NULL; \59\60if ((*decoder)(&data_in, &v) != 0) \61break; \62\63(*encoder)(v, &data_out); \64krb5_free_data(context, data_out); \65(*freefn)(context, v); \66} while (0)6768int69LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)70{71krb5_context context;72krb5_data data_in;7374if (size < kMinInputLength || size > kMaxInputLength)75return 0;7677if (krb5_init_context(&context))78return 0;7980data_in = make_data((void *)data, size);8182/* Adapted from krb5_decode_leak.c */83FUZZ_ASAN(krb5_authenticator, encode_krb5_authenticator,84decode_krb5_authenticator, krb5_free_authenticator);85FUZZ_ASAN(krb5_ticket, encode_krb5_ticket, decode_krb5_ticket,86krb5_free_ticket);87FUZZ_ASAN(krb5_keyblock, encode_krb5_encryption_key,88decode_krb5_encryption_key, krb5_free_keyblock);89FUZZ_ASAN(krb5_enc_tkt_part, encode_krb5_enc_tkt_part,90decode_krb5_enc_tkt_part, krb5_free_enc_tkt_part);91FUZZ_ASAN(krb5_enc_kdc_rep_part, encode_krb5_enc_kdc_rep_part,92decode_krb5_enc_kdc_rep_part, krb5_free_enc_kdc_rep_part);93FUZZ_ASAN(krb5_kdc_rep, encode_krb5_as_rep, decode_krb5_as_rep,94krb5_free_kdc_rep);95FUZZ_ASAN(krb5_kdc_rep, encode_krb5_tgs_rep, decode_krb5_tgs_rep,96krb5_free_kdc_rep);97FUZZ_ASAN(krb5_ap_req, encode_krb5_ap_req, decode_krb5_ap_req,98krb5_free_ap_req);99FUZZ_ASAN(krb5_ap_rep, encode_krb5_ap_rep, decode_krb5_ap_rep,100krb5_free_ap_rep);101FUZZ_ASAN(krb5_ap_rep_enc_part, encode_krb5_ap_rep_enc_part,102decode_krb5_ap_rep_enc_part, krb5_free_ap_rep_enc_part);103FUZZ_ASAN(krb5_kdc_req, encode_krb5_as_req, decode_krb5_as_req,104krb5_free_kdc_req);105FUZZ_ASAN(krb5_kdc_req, encode_krb5_tgs_req, decode_krb5_tgs_req,106krb5_free_kdc_req);107FUZZ_ASAN(krb5_kdc_req, encode_krb5_kdc_req_body, decode_krb5_kdc_req_body,108krb5_free_kdc_req);109FUZZ_ASAN(krb5_safe, encode_krb5_safe, decode_krb5_safe, krb5_free_safe);110FUZZ_ASAN(krb5_priv, encode_krb5_priv, decode_krb5_priv, krb5_free_priv);111FUZZ_ASAN(krb5_priv_enc_part, encode_krb5_enc_priv_part,112decode_krb5_enc_priv_part, krb5_free_priv_enc_part);113FUZZ_ASAN(krb5_cred, encode_krb5_cred, decode_krb5_cred, krb5_free_cred);114FUZZ_ASAN(krb5_cred_enc_part, encode_krb5_enc_cred_part,115decode_krb5_enc_cred_part, free_cred_enc_part_whole);116FUZZ_ASAN(krb5_error, encode_krb5_error, decode_krb5_error,117krb5_free_error);118FUZZ_ASAN(krb5_authdata *, encode_krb5_authdata, decode_krb5_authdata,119krb5_free_authdata);120FUZZ_ASAN(krb5_pa_data *, encode_krb5_padata_sequence,121decode_krb5_padata_sequence, krb5_free_pa_data);122FUZZ_ASAN(krb5_pa_data *, encode_krb5_typed_data,123decode_krb5_typed_data, krb5_free_pa_data);124FUZZ_ASAN(krb5_etype_info_entry *, encode_krb5_etype_info,125decode_krb5_etype_info, krb5_free_etype_info);126FUZZ_ASAN(krb5_etype_info_entry *, encode_krb5_etype_info2,127decode_krb5_etype_info2, krb5_free_etype_info);128FUZZ_ASAN(krb5_pa_enc_ts, encode_krb5_pa_enc_ts, decode_krb5_pa_enc_ts,129krb5_free_pa_enc_ts);130FUZZ_ASAN(krb5_enc_data, encode_krb5_enc_data, decode_krb5_enc_data,131krb5_free_enc_data);132FUZZ_ASAN(krb5_sam_challenge_2, encode_krb5_sam_challenge_2,133decode_krb5_sam_challenge_2, krb5_free_sam_challenge_2);134FUZZ_ASAN(krb5_sam_challenge_2_body, encode_krb5_sam_challenge_2_body,135decode_krb5_sam_challenge_2_body,136krb5_free_sam_challenge_2_body);137FUZZ_ASAN(krb5_sam_response_2, encode_krb5_sam_response_2,138decode_krb5_sam_response_2, krb5_free_sam_response_2);139FUZZ_ASAN(krb5_enc_sam_response_enc_2, encode_krb5_enc_sam_response_enc_2,140decode_krb5_enc_sam_response_enc_2,141krb5_free_enc_sam_response_enc_2);142FUZZ_ASAN(krb5_pa_for_user, encode_krb5_pa_for_user,143decode_krb5_pa_for_user, krb5_free_pa_for_user);144FUZZ_ASAN(krb5_pa_s4u_x509_user, encode_krb5_pa_s4u_x509_user,145decode_krb5_pa_s4u_x509_user, krb5_free_pa_s4u_x509_user);146FUZZ_ASAN(krb5_ad_kdcissued, encode_krb5_ad_kdcissued,147decode_krb5_ad_kdcissued, krb5_free_ad_kdcissued);148FUZZ_ASAN(krb5_iakerb_header, encode_krb5_iakerb_header,149decode_krb5_iakerb_header, krb5_free_iakerb_header);150FUZZ_ASAN(krb5_iakerb_finished, encode_krb5_iakerb_finished,151decode_krb5_iakerb_finished, krb5_free_iakerb_finished);152FUZZ_ASAN(krb5_fast_response, encode_krb5_fast_response,153decode_krb5_fast_response, krb5_free_fast_response);154FUZZ_ASAN(krb5_enc_data, encode_krb5_pa_fx_fast_reply,155decode_krb5_pa_fx_fast_reply, krb5_free_enc_data);156157/* Adapted from krb5_encode_test.c */158FUZZ_ASAN(krb5_otp_tokeninfo, encode_krb5_otp_tokeninfo,159decode_krb5_otp_tokeninfo, k5_free_otp_tokeninfo);160FUZZ_ASAN(krb5_pa_otp_challenge, encode_krb5_pa_otp_challenge,161decode_krb5_pa_otp_challenge, k5_free_pa_otp_challenge);162FUZZ_ASAN(krb5_pa_otp_req, encode_krb5_pa_otp_req, decode_krb5_pa_otp_req,163k5_free_pa_otp_req);164FUZZ_ASAN(krb5_data, encode_krb5_pa_otp_enc_req,165decode_krb5_pa_otp_enc_req, krb5_free_data);166FUZZ_ASAN(krb5_kkdcp_message, encode_krb5_kkdcp_message,167decode_krb5_kkdcp_message, free_kkdcp_message);168FUZZ_ASAN(krb5_cammac, encode_krb5_cammac, decode_krb5_cammac,169k5_free_cammac);170FUZZ_ASAN(krb5_secure_cookie, encode_krb5_secure_cookie,171decode_krb5_secure_cookie, k5_free_secure_cookie);172FUZZ_ASAN(krb5_spake_factor, encode_krb5_spake_factor,173decode_krb5_spake_factor, k5_free_spake_factor);174FUZZ_ASAN(krb5_pa_spake, encode_krb5_pa_spake, decode_krb5_pa_spake,175k5_free_pa_spake);176177/* Adapted from krb5_decode_test.c */178{179krb5_pa_pac_req *pa_pac_req = NULL;180181if (decode_krb5_pa_pac_req(&data_in, &pa_pac_req) == 0)182free(pa_pac_req);183}184185krb5_free_context(context);186return 0;187}188189190