1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <openssl/objects.h> 11e1051a39Sopenharmony_ci#include "obj_xref.h" 12e1051a39Sopenharmony_ci#include "internal/nelem.h" 13e1051a39Sopenharmony_ci#include <openssl/err.h> 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_cistatic STACK_OF(nid_triple) *sig_app, *sigx_app; 16e1051a39Sopenharmony_ci 17e1051a39Sopenharmony_cistatic int sig_cmp(const nid_triple *a, const nid_triple *b) 18e1051a39Sopenharmony_ci{ 19e1051a39Sopenharmony_ci return a->sign_id - b->sign_id; 20e1051a39Sopenharmony_ci} 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_ciDECLARE_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig); 23e1051a39Sopenharmony_ciIMPLEMENT_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig); 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_cistatic int sig_sk_cmp(const nid_triple *const *a, const nid_triple *const *b) 26e1051a39Sopenharmony_ci{ 27e1051a39Sopenharmony_ci return (*a)->sign_id - (*b)->sign_id; 28e1051a39Sopenharmony_ci} 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ciDECLARE_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx); 31e1051a39Sopenharmony_ci 32e1051a39Sopenharmony_cistatic int sigx_cmp(const nid_triple *const *a, const nid_triple *const *b) 33e1051a39Sopenharmony_ci{ 34e1051a39Sopenharmony_ci int ret; 35e1051a39Sopenharmony_ci ret = (*a)->hash_id - (*b)->hash_id; 36e1051a39Sopenharmony_ci if (ret) 37e1051a39Sopenharmony_ci return ret; 38e1051a39Sopenharmony_ci return (*a)->pkey_id - (*b)->pkey_id; 39e1051a39Sopenharmony_ci} 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_ciIMPLEMENT_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx); 42e1051a39Sopenharmony_ci 43e1051a39Sopenharmony_ciint OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid) 44e1051a39Sopenharmony_ci{ 45e1051a39Sopenharmony_ci nid_triple tmp; 46e1051a39Sopenharmony_ci const nid_triple *rv = NULL; 47e1051a39Sopenharmony_ci tmp.sign_id = signid; 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ci if (sig_app != NULL) { 50e1051a39Sopenharmony_ci int idx = sk_nid_triple_find(sig_app, &tmp); 51e1051a39Sopenharmony_ci rv = sk_nid_triple_value(sig_app, idx); 52e1051a39Sopenharmony_ci } 53e1051a39Sopenharmony_ci#ifndef OBJ_XREF_TEST2 54e1051a39Sopenharmony_ci if (rv == NULL) { 55e1051a39Sopenharmony_ci rv = OBJ_bsearch_sig(&tmp, sigoid_srt, OSSL_NELEM(sigoid_srt)); 56e1051a39Sopenharmony_ci } 57e1051a39Sopenharmony_ci#endif 58e1051a39Sopenharmony_ci if (rv == NULL) 59e1051a39Sopenharmony_ci return 0; 60e1051a39Sopenharmony_ci if (pdig_nid) 61e1051a39Sopenharmony_ci *pdig_nid = rv->hash_id; 62e1051a39Sopenharmony_ci if (ppkey_nid) 63e1051a39Sopenharmony_ci *ppkey_nid = rv->pkey_id; 64e1051a39Sopenharmony_ci return 1; 65e1051a39Sopenharmony_ci} 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_ciint OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid) 68e1051a39Sopenharmony_ci{ 69e1051a39Sopenharmony_ci nid_triple tmp; 70e1051a39Sopenharmony_ci const nid_triple *t = &tmp; 71e1051a39Sopenharmony_ci const nid_triple **rv = NULL; 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ci tmp.hash_id = dig_nid; 74e1051a39Sopenharmony_ci tmp.pkey_id = pkey_nid; 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci if (sigx_app) { 77e1051a39Sopenharmony_ci int idx = sk_nid_triple_find(sigx_app, &tmp); 78e1051a39Sopenharmony_ci if (idx >= 0) { 79e1051a39Sopenharmony_ci t = sk_nid_triple_value(sigx_app, idx); 80e1051a39Sopenharmony_ci rv = &t; 81e1051a39Sopenharmony_ci } 82e1051a39Sopenharmony_ci } 83e1051a39Sopenharmony_ci#ifndef OBJ_XREF_TEST2 84e1051a39Sopenharmony_ci if (rv == NULL) { 85e1051a39Sopenharmony_ci rv = OBJ_bsearch_sigx(&t, sigoid_srt_xref, OSSL_NELEM(sigoid_srt_xref)); 86e1051a39Sopenharmony_ci } 87e1051a39Sopenharmony_ci#endif 88e1051a39Sopenharmony_ci if (rv == NULL) 89e1051a39Sopenharmony_ci return 0; 90e1051a39Sopenharmony_ci if (psignid) 91e1051a39Sopenharmony_ci *psignid = (*rv)->sign_id; 92e1051a39Sopenharmony_ci return 1; 93e1051a39Sopenharmony_ci} 94e1051a39Sopenharmony_ci 95e1051a39Sopenharmony_ciint OBJ_add_sigid(int signid, int dig_id, int pkey_id) 96e1051a39Sopenharmony_ci{ 97e1051a39Sopenharmony_ci nid_triple *ntr; 98e1051a39Sopenharmony_ci if (sig_app == NULL) 99e1051a39Sopenharmony_ci sig_app = sk_nid_triple_new(sig_sk_cmp); 100e1051a39Sopenharmony_ci if (sig_app == NULL) 101e1051a39Sopenharmony_ci return 0; 102e1051a39Sopenharmony_ci if (sigx_app == NULL) 103e1051a39Sopenharmony_ci sigx_app = sk_nid_triple_new(sigx_cmp); 104e1051a39Sopenharmony_ci if (sigx_app == NULL) 105e1051a39Sopenharmony_ci return 0; 106e1051a39Sopenharmony_ci if ((ntr = OPENSSL_malloc(sizeof(*ntr))) == NULL) { 107e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_OBJ, ERR_R_MALLOC_FAILURE); 108e1051a39Sopenharmony_ci return 0; 109e1051a39Sopenharmony_ci } 110e1051a39Sopenharmony_ci ntr->sign_id = signid; 111e1051a39Sopenharmony_ci ntr->hash_id = dig_id; 112e1051a39Sopenharmony_ci ntr->pkey_id = pkey_id; 113e1051a39Sopenharmony_ci 114e1051a39Sopenharmony_ci if (!sk_nid_triple_push(sig_app, ntr)) { 115e1051a39Sopenharmony_ci OPENSSL_free(ntr); 116e1051a39Sopenharmony_ci return 0; 117e1051a39Sopenharmony_ci } 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_ci if (!sk_nid_triple_push(sigx_app, ntr)) 120e1051a39Sopenharmony_ci return 0; 121e1051a39Sopenharmony_ci 122e1051a39Sopenharmony_ci sk_nid_triple_sort(sig_app); 123e1051a39Sopenharmony_ci sk_nid_triple_sort(sigx_app); 124e1051a39Sopenharmony_ci 125e1051a39Sopenharmony_ci return 1; 126e1051a39Sopenharmony_ci} 127e1051a39Sopenharmony_ci 128e1051a39Sopenharmony_cistatic void sid_free(nid_triple *tt) 129e1051a39Sopenharmony_ci{ 130e1051a39Sopenharmony_ci OPENSSL_free(tt); 131e1051a39Sopenharmony_ci} 132e1051a39Sopenharmony_ci 133e1051a39Sopenharmony_civoid OBJ_sigid_free(void) 134e1051a39Sopenharmony_ci{ 135e1051a39Sopenharmony_ci sk_nid_triple_pop_free(sig_app, sid_free); 136e1051a39Sopenharmony_ci sig_app = NULL; 137e1051a39Sopenharmony_ci sk_nid_triple_free(sigx_app); 138e1051a39Sopenharmony_ci sigx_app = NULL; 139e1051a39Sopenharmony_ci} 140