1 /* crypto/objects/obj_xref.c */ 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * project 2006. 4 */ 5 /* ==================================================================== 6 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgment: 22 * "This product includes software developed by the OpenSSL Project 23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24 * 25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26 * endorse or promote products derived from this software without 27 * prior written permission. For written permission, please contact 28 * licensing@OpenSSL.org. 29 * 30 * 5. Products derived from this software may not be called "OpenSSL" 31 * nor may "OpenSSL" appear in their names without prior written 32 * permission of the OpenSSL Project. 33 * 34 * 6. Redistributions of any form whatsoever must retain the following 35 * acknowledgment: 36 * "This product includes software developed by the OpenSSL Project 37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38 * 39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50 * OF THE POSSIBILITY OF SUCH DAMAGE. 51 * ==================================================================== 52 * 53 * This product includes cryptographic software written by Eric Young 54 * (eay@cryptsoft.com). This product includes software written by Tim 55 * Hudson (tjh@cryptsoft.com). 56 * 57 */ 58 59 #include <openssl/objects.h> 60 #include "obj_xref.h" 61 62 DECLARE_STACK_OF(nid_triple) 63 STACK_OF(nid_triple) *sig_app, *sigx_app; 64 65 static int sig_cmp(const nid_triple *a, const nid_triple *b) 66 { 67 return a->sign_id - b->sign_id; 68 } 69 70 DECLARE_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig); 71 IMPLEMENT_OBJ_BSEARCH_CMP_FN(nid_triple, nid_triple, sig); 72 73 static int sig_sk_cmp(const nid_triple * const *a, const nid_triple * const *b) 74 { 75 return (*a)->sign_id - (*b)->sign_id; 76 } 77 78 DECLARE_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx); 79 80 static int sigx_cmp(const nid_triple * const *a, const nid_triple * const *b) 81 { 82 int ret; 83 ret = (*a)->hash_id - (*b)->hash_id; 84 if (ret) 85 return ret; 86 return (*a)->pkey_id - (*b)->pkey_id; 87 } 88 89 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const nid_triple *, const nid_triple *, sigx); 90 91 int OBJ_find_sigid_algs(int signid, int *pdig_nid, int *ppkey_nid) 92 { 93 nid_triple tmp; 94 const nid_triple *rv = NULL; 95 tmp.sign_id = signid; 96 97 if (sig_app) 98 { 99 int idx = sk_nid_triple_find(sig_app, &tmp); 100 if (idx >= 0) 101 rv = sk_nid_triple_value(sig_app, idx); 102 } 103 104 #ifndef OBJ_XREF_TEST2 105 if (rv == NULL) 106 { 107 rv = OBJ_bsearch_sig(&tmp, sigoid_srt, 108 sizeof(sigoid_srt) / sizeof(nid_triple)); 109 } 110 #endif 111 if (rv == NULL) 112 return 0; 113 if (pdig_nid) 114 *pdig_nid = rv->hash_id; 115 if (ppkey_nid) 116 *ppkey_nid = rv->pkey_id; 117 return 1; 118 } 119 120 int OBJ_find_sigid_by_algs(int *psignid, int dig_nid, int pkey_nid) 121 { 122 nid_triple tmp; 123 const nid_triple *t=&tmp; 124 const nid_triple **rv = NULL; 125 126 tmp.hash_id = dig_nid; 127 tmp.pkey_id = pkey_nid; 128 129 if (sigx_app) 130 { 131 int idx = sk_nid_triple_find(sigx_app, &tmp); 132 if (idx >= 0) 133 { 134 t = sk_nid_triple_value(sigx_app, idx); 135 rv = &t; 136 } 137 } 138 139 #ifndef OBJ_XREF_TEST2 140 if (rv == NULL) 141 { 142 rv = OBJ_bsearch_sigx(&t, sigoid_srt_xref, 143 sizeof(sigoid_srt_xref) / sizeof(nid_triple *) 144 ); 145 } 146 #endif 147 if (rv == NULL) 148 return 0; 149 if (psignid) 150 *psignid = (*rv)->sign_id; 151 return 1; 152 } 153 154 int OBJ_add_sigid(int signid, int dig_id, int pkey_id) 155 { 156 nid_triple *ntr; 157 if (!sig_app) 158 sig_app = sk_nid_triple_new(sig_sk_cmp); 159 if (!sig_app) 160 return 0; 161 if (!sigx_app) 162 sigx_app = sk_nid_triple_new(sigx_cmp); 163 if (!sigx_app) 164 return 0; 165 ntr = OPENSSL_malloc(sizeof(int) * 3); 166 if (!ntr) 167 return 0; 168 ntr->sign_id = signid; 169 ntr->hash_id = dig_id; 170 ntr->pkey_id = pkey_id; 171 172 if (!sk_nid_triple_push(sig_app, ntr)) 173 { 174 OPENSSL_free(ntr); 175 return 0; 176 } 177 178 if (!sk_nid_triple_push(sigx_app, ntr)) 179 return 0; 180 181 sk_nid_triple_sort(sig_app); 182 sk_nid_triple_sort(sigx_app); 183 184 return 1; 185 } 186 187 static void sid_free(nid_triple *tt) 188 { 189 OPENSSL_free(tt); 190 } 191 192 void OBJ_sigid_free(void) 193 { 194 if (sig_app) 195 { 196 sk_nid_triple_pop_free(sig_app, sid_free); 197 sig_app = NULL; 198 } 199 if (sigx_app) 200 { 201 sk_nid_triple_free(sigx_app); 202 sigx_app = NULL; 203 } 204 } 205 206 #ifdef OBJ_XREF_TEST 207 208 main() 209 { 210 int n1, n2, n3; 211 212 int i, rv; 213 #ifdef OBJ_XREF_TEST2 214 for (i = 0; i < sizeof(sigoid_srt) / sizeof(nid_triple); i++) 215 { 216 OBJ_add_sigid(sigoid_srt[i][0], sigoid_srt[i][1], 217 sigoid_srt[i][2]); 218 } 219 #endif 220 221 for (i = 0; i < sizeof(sigoid_srt) / sizeof(nid_triple); i++) 222 { 223 n1 = sigoid_srt[i][0]; 224 rv = OBJ_find_sigid_algs(n1, &n2, &n3); 225 printf("Forward: %d, %s %s %s\n", rv, 226 OBJ_nid2ln(n1), OBJ_nid2ln(n2), OBJ_nid2ln(n3)); 227 n1=0; 228 rv = OBJ_find_sigid_by_algs(&n1, n2, n3); 229 printf("Reverse: %d, %s %s %s\n", rv, 230 OBJ_nid2ln(n1), OBJ_nid2ln(n2), OBJ_nid2ln(n3)); 231 } 232 } 233 234 #endif