Path: blob/main/crypto/krb5/src/plugins/preauth/pkinit/pkinit_lib.c
34923 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/*2* COPYRIGHT (C) 2006,20073* THE REGENTS OF THE UNIVERSITY OF MICHIGAN4* ALL RIGHTS RESERVED5*6* Permission is granted to use, copy, create derivative works7* and redistribute this software and such derivative works8* for any purpose, so long as the name of The University of9* Michigan is not used in any advertising or publicity10* pertaining to the use of distribution of this software11* without specific, written prior authorization. If the12* above copyright notice or any other identification of the13* University of Michigan is included in any copy of any14* portion of this software, then the disclaimer below must15* also be included.16*17* THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION18* FROM THE UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY19* PURPOSE, AND WITHOUT WARRANTY BY THE UNIVERSITY OF20* MICHIGAN OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING21* WITHOUT LIMITATION THE IMPLIED WARRANTIES OF22* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE23* REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE24* FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR25* CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING26* OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN27* IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF28* SUCH DAMAGES.29*/3031#include "k5-int.h"32#include "pkinit.h"3334#define FAKECERT3536krb5_error_code37pkinit_init_req_opts(pkinit_req_opts **reqopts)38{39krb5_error_code retval = ENOMEM;40pkinit_req_opts *opts = NULL;4142*reqopts = NULL;43opts = calloc(1, sizeof(*opts));44if (opts == NULL)45return retval;4647opts->require_eku = 1;48opts->accept_secondary_eku = 0;49opts->allow_upn = 0;50opts->require_crl_checking = 0;51opts->dh_size = PKINIT_DEFAULT_DH_MIN_BITS;5253*reqopts = opts;5455return 0;56}5758void59pkinit_fini_req_opts(pkinit_req_opts *opts)60{61free(opts);62return;63}6465krb5_error_code66pkinit_init_plg_opts(pkinit_plg_opts **plgopts)67{68krb5_error_code retval = ENOMEM;69pkinit_plg_opts *opts = NULL;7071*plgopts = NULL;72opts = calloc(1, sizeof(pkinit_plg_opts));73if (opts == NULL)74return retval;7576opts->require_eku = 1;77opts->accept_secondary_eku = 0;78opts->allow_upn = 0;79opts->require_crl_checking = 0;80opts->require_freshness = 0;81opts->disable_freshness = 0;8283opts->dh_min_bits = PKINIT_DEFAULT_DH_MIN_BITS;8485*plgopts = opts;8687return 0;88}8990void91pkinit_fini_plg_opts(pkinit_plg_opts *opts)92{93free(opts);94return;95}9697void98free_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in)99{100if (*in == NULL) return;101free((*in)->signedAuthPack.data);102if ((*in)->trustedCertifiers != NULL)103free_krb5_external_principal_identifier(&(*in)->trustedCertifiers);104free((*in)->kdcPkId.data);105free(*in);106}107108void109free_krb5_reply_key_pack(krb5_reply_key_pack **in)110{111if (*in == NULL) return;112free((*in)->replyKey.contents);113free((*in)->asChecksum.contents);114free(*in);115}116117void118free_krb5_auth_pack(krb5_auth_pack **in)119{120if ((*in) == NULL) return;121krb5_free_data_contents(NULL, &(*in)->clientPublicValue);122free((*in)->pkAuthenticator.paChecksum.data);123krb5_free_data(NULL, (*in)->pkAuthenticator.freshnessToken);124free_pachecksum2(NULL, &(*in)->pkAuthenticator.paChecksum2);125if ((*in)->supportedCMSTypes != NULL)126free_krb5_algorithm_identifiers(&((*in)->supportedCMSTypes));127if ((*in)->supportedKDFs) {128krb5_data **supportedKDFs = (*in)->supportedKDFs;129unsigned i;130for (i = 0; supportedKDFs[i]; i++)131krb5_free_data(NULL, supportedKDFs[i]);132free(supportedKDFs);133}134free(*in);135}136137void138free_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in)139{140if (*in == NULL) return;141switch ((*in)->choice) {142case choice_pa_pk_as_rep_dhInfo:143krb5_free_data(NULL, (*in)->u.dh_Info.kdfID);144free((*in)->u.dh_Info.dhSignedData.data);145break;146case choice_pa_pk_as_rep_encKeyPack:147free((*in)->u.encKeyPack.data);148break;149default:150break;151}152free(*in);153}154155void156free_krb5_external_principal_identifier(krb5_external_principal_identifier ***in)157{158int i = 0;159if (*in == NULL) return;160while ((*in)[i] != NULL) {161free((*in)[i]->subjectName.data);162free((*in)[i]->issuerAndSerialNumber.data);163free((*in)[i]->subjectKeyIdentifier.data);164free((*in)[i]);165i++;166}167free(*in);168}169170void171free_krb5_algorithm_identifier(krb5_algorithm_identifier *in)172{173if (in == NULL)174return;175free(in->algorithm.data);176free(in->parameters.data);177free(in);178}179180void181free_krb5_algorithm_identifiers(krb5_algorithm_identifier ***in)182{183int i;184if (in == NULL || *in == NULL)185return;186for (i = 0; (*in)[i] != NULL; i++) {187free_krb5_algorithm_identifier((*in)[i]);188}189free(*in);190}191192void193free_krb5_kdc_dh_key_info(krb5_kdc_dh_key_info **in)194{195if (*in == NULL) return;196free((*in)->subjectPublicKey.data);197free(*in);198}199200void201free_pachecksum2(krb5_context context, krb5_pachecksum2 **in)202{203if (*in == NULL)204return;205krb5_free_data_contents(context, &(*in)->checksum);206krb5_free_data_contents(context, &(*in)->algorithmIdentifier.algorithm);207krb5_free_data_contents(context, &(*in)->algorithmIdentifier.parameters);208free(*in);209*in = NULL;210}211212void213init_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in)214{215(*in) = malloc(sizeof(krb5_pa_pk_as_req));216if ((*in) == NULL) return;217(*in)->signedAuthPack.data = NULL;218(*in)->signedAuthPack.length = 0;219(*in)->trustedCertifiers = NULL;220(*in)->kdcPkId.data = NULL;221(*in)->kdcPkId.length = 0;222}223224void225init_krb5_reply_key_pack(krb5_reply_key_pack **in)226{227(*in) = malloc(sizeof(krb5_reply_key_pack));228if ((*in) == NULL) return;229(*in)->replyKey.contents = NULL;230(*in)->replyKey.length = 0;231(*in)->asChecksum.contents = NULL;232(*in)->asChecksum.length = 0;233}234235void236init_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in)237{238(*in) = malloc(sizeof(krb5_pa_pk_as_rep));239if ((*in) == NULL) return;240(*in)->u.dh_Info.serverDHNonce.length = 0;241(*in)->u.dh_Info.serverDHNonce.data = NULL;242(*in)->u.dh_Info.dhSignedData.length = 0;243(*in)->u.dh_Info.dhSignedData.data = NULL;244(*in)->u.encKeyPack.length = 0;245(*in)->u.encKeyPack.data = NULL;246(*in)->u.dh_Info.kdfID = NULL;247}248249krb5_error_code250pkinit_copy_krb5_data(krb5_data *dst, const krb5_data *src)251{252if (dst == NULL || src == NULL)253return EINVAL;254if (src->data == NULL) {255dst->data = NULL;256dst->length = 0;257return 0;258}259dst->data = malloc(src->length);260if (dst->data == NULL)261return ENOMEM;262memcpy(dst->data, src->data, src->length);263dst->length = src->length;264return 0;265}266267/* debugging functions */268void269print_buffer(const unsigned char *buf, unsigned int len)270{271unsigned i = 0;272if (len <= 0)273return;274275for (i = 0; i < len; i++)276pkiDebug("%02x ", buf[i]);277pkiDebug("\n");278}279280void281print_buffer_bin(unsigned char *buf, unsigned int len, char *filename)282{283FILE *f = NULL;284unsigned int i = 0;285286if (len <= 0 || filename == NULL)287return;288289if ((f = fopen(filename, "w")) == NULL)290return;291292set_cloexec_file(f);293294for (i = 0; i < len; i++)295fputc(buf[i], f);296297fclose(f);298}299300301