ameth_lib.c revision e45f106cb6b47af1f21efe76e933bdea2f5dd1ca
1e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * project 2006. 3e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson */ 4e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson/* ==================================================================== 5e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 6e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 7e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * Redistribution and use in source and binary forms, with or without 8e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * modification, are permitted provided that the following conditions 9e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * are met: 10e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 11e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 1. Redistributions of source code must retain the above copyright 12e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * notice, this list of conditions and the following disclaimer. 13e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 14e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 2. Redistributions in binary form must reproduce the above copyright 15e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * notice, this list of conditions and the following disclaimer in 16e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * the documentation and/or other materials provided with the 17e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * distribution. 18283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * 19e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 3. All advertising materials mentioning features or use of this 20e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * software must display the following acknowledgment: 21774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson * "This product includes software developed by the OpenSSL Project 2286e9644199d91a33d0090395395bc718bd3a4981Anders Carlsson * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 23e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 24e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 25e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * endorse or promote products derived from this software without 26e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * prior written permission. For written permission, please contact 270096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * licensing@OpenSSL.org. 280096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * 290096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * 5. Products derived from this software may not be called "OpenSSL" 300096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * nor may "OpenSSL" appear in their names without prior written 310096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * permission of the OpenSSL Project. 32e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 33e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 6. Redistributions of any form whatsoever must retain the following 34e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * acknowledgment: 35283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * "This product includes software developed by the OpenSSL Project 36283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 37283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * 38283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 39e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 40e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 41e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 420096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 43e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 44283a062a633d6e868aa2be319da812341fe73728Anders Carlsson * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 45e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 46e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 47e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 480096acf421c4609ce7f43e8b05f8c5ca866d4611Daniel Dunbar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 49e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * OF THE POSSIBILITY OF SUCH DAMAGE. 50e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * ==================================================================== 51e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 52e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * This product includes cryptographic software written by Eric Young 53e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * (eay@cryptsoft.com). This product includes software written by Tim 54e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * Hudson (tjh@cryptsoft.com). 55e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson * 5655e874299f2ad827646a4ca9ea38c402aaeb38c9Daniel Dunbar */ 579615ecb44f549ae9fa2b4db6ff46bc78befbf62cDaniel Dunbar 58e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include <stdio.h> 59e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "cryptlib.h" 60e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include <openssl/asn1t.h> 61e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include <openssl/x509.h> 62e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#ifndef OPENSSL_NO_ENGINE 63e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include <openssl/engine.h> 64e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#endif 65e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "asn1_locl.h" 66e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson 67e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonextern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[]; 68e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonextern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[]; 69e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonextern const EVP_PKEY_ASN1_METHOD dh_asn1_meth; 70e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonextern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth; 71e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonextern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth; 72e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson 73e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson/* Keep this sorted in type order !! */ 74e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonstatic const EVP_PKEY_ASN1_METHOD *standard_methods[] = 75e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson { 76e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#ifndef OPENSSL_NO_RSA 77e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson &rsa_asn1_meths[0], 78e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson &rsa_asn1_meths[1], 79e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#endif 80774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#ifndef OPENSSL_NO_DH 81774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &dh_asn1_meth, 82774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#endif 83774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#ifndef OPENSSL_NO_DSA 84774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &dsa_asn1_meths[0], 85774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &dsa_asn1_meths[1], 86e9918d2443ad524e0f488e8f15d9bce4e7373cd1Anders Carlsson &dsa_asn1_meths[2], 87774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &dsa_asn1_meths[3], 88e9918d2443ad524e0f488e8f15d9bce4e7373cd1Anders Carlsson &dsa_asn1_meths[4], 89e9918d2443ad524e0f488e8f15d9bce4e7373cd1Anders Carlsson#endif 90774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#ifndef OPENSSL_NO_EC 91774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &eckey_asn1_meth, 92774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#endif 93774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson &hmac_asn1_meth 94774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson }; 95774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson 96774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlssontypedef int sk_cmp_fn_type(const char * const *a, const char * const *b); 97774e7c6881ee6cb970cd42239d700dce87ed402aAnders CarlssonDECLARE_STACK_OF(EVP_PKEY_ASN1_METHOD) 98774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlssonstatic STACK_OF(EVP_PKEY_ASN1_METHOD) *app_methods = NULL; 99774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson 100774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson 101774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson 102774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#ifdef TEST 103774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlssonvoid main() 104774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson { 105774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson int i; 106774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson for (i = 0; 107774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson i < sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *); 108774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson i++) 109774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson fprintf(stderr, "Number %d id=%d (%s)\n", i, 110782f397c1459ef7d8b910c0fb6b95c5f1c19c14fAnders Carlsson standard_methods[i]->pkey_id, 111774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson OBJ_nid2sn(standard_methods[i]->pkey_id)); 112774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson } 113e9918d2443ad524e0f488e8f15d9bce4e7373cd1Anders Carlsson#endif 114e9918d2443ad524e0f488e8f15d9bce4e7373cd1Anders Carlsson 115774e7c6881ee6cb970cd42239d700dce87ed402aAnders CarlssonDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 1165f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson const EVP_PKEY_ASN1_METHOD *, ameth); 1175f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson 1185f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlssonstatic int ameth_cmp(const EVP_PKEY_ASN1_METHOD * const *a, 1195f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson const EVP_PKEY_ASN1_METHOD * const *b) 1205f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson { 1215f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson return ((*a)->pkey_id - (*b)->pkey_id); 1225f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson } 1235f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson 1245f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders CarlssonIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *, 1255f4307b7ba164b03c853c8d3eb4674d33f8967a6Anders Carlsson const EVP_PKEY_ASN1_METHOD *, ameth); 12695d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson 12795d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlssonint EVP_PKEY_asn1_get_count(void) 12895d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson { 12995d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson int num = sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *); 13095d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson if (app_methods) 13195d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson num += sk_EVP_PKEY_ASN1_METHOD_num(app_methods); 13295d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson return num; 13395d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson } 13495d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson 13595d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlssonconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx) 13695d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson { 13795d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson int num = sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *); 13895d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson if (idx < 0) 13995d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson return NULL; 14095d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson if (idx < num) 14195d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson return standard_methods[idx]; 14295d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson idx -= num; 14395d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 14495d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson } 14595d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson 14695d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlssonstatic const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type) 14795d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson { 14895d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson EVP_PKEY_ASN1_METHOD tmp; 14995d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson const EVP_PKEY_ASN1_METHOD *t = &tmp, **ret; 15095d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson tmp.pkey_id = type; 15195d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson if (app_methods) 15295d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson { 15395d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson int idx; 15495d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson idx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp); 15595d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson if (idx >= 0) 15695d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx); 15795d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson } 158 ret = OBJ_bsearch_ameth(&t, standard_methods, 159 sizeof(standard_methods) 160 /sizeof(EVP_PKEY_ASN1_METHOD *)); 161 if (!ret || !*ret) 162 return NULL; 163 return *ret; 164 } 165 166/* Find an implementation of an ASN1 algorithm. If 'pe' is not NULL 167 * also search through engines and set *pe to a functional reference 168 * to the engine implementing 'type' or NULL if no engine implements 169 * it. 170 */ 171 172const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type) 173 { 174 const EVP_PKEY_ASN1_METHOD *t; 175 ENGINE *e; 176 177 for (;;) 178 { 179 t = pkey_asn1_find(type); 180 if (!t || !(t->pkey_flags & ASN1_PKEY_ALIAS)) 181 break; 182 type = t->pkey_base_id; 183 } 184 if (pe) 185 { 186#ifndef OPENSSL_NO_ENGINE 187 /* type will contain the final unaliased type */ 188 e = ENGINE_get_pkey_asn1_meth_engine(type); 189 if (e) 190 { 191 *pe = e; 192 return ENGINE_get_pkey_asn1_meth(e, type); 193 } 194#endif 195 *pe = NULL; 196 } 197 return t; 198 } 199 200const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe, 201 const char *str, int len) 202 { 203 int i; 204 const EVP_PKEY_ASN1_METHOD *ameth; 205 if (len == -1) 206 len = strlen(str); 207 if (pe) 208 { 209#ifndef OPENSSL_NO_ENGINE 210 ENGINE *e; 211 ameth = ENGINE_pkey_asn1_find_str(&e, str, len); 212 if (ameth) 213 { 214 /* Convert structural into 215 * functional reference 216 */ 217 if (!ENGINE_init(e)) 218 ameth = NULL; 219 ENGINE_free(e); 220 *pe = e; 221 return ameth; 222 } 223#endif 224 *pe = NULL; 225 } 226 for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) 227 { 228 ameth = EVP_PKEY_asn1_get0(i); 229 if (ameth->pkey_flags & ASN1_PKEY_ALIAS) 230 continue; 231 if (((int)strlen(ameth->pem_str) == len) && 232 !strncasecmp(ameth->pem_str, str, len)) 233 return ameth; 234 } 235 return NULL; 236 } 237 238int EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth) 239 { 240 if (app_methods == NULL) 241 { 242 app_methods = sk_EVP_PKEY_ASN1_METHOD_new(ameth_cmp); 243 if (!app_methods) 244 return 0; 245 } 246 if (!sk_EVP_PKEY_ASN1_METHOD_push(app_methods, ameth)) 247 return 0; 248 sk_EVP_PKEY_ASN1_METHOD_sort(app_methods); 249 return 1; 250 } 251 252int EVP_PKEY_asn1_add_alias(int to, int from) 253 { 254 EVP_PKEY_ASN1_METHOD *ameth; 255 ameth = EVP_PKEY_asn1_new(from, ASN1_PKEY_ALIAS, NULL, NULL); 256 if (!ameth) 257 return 0; 258 ameth->pkey_base_id = to; 259 return EVP_PKEY_asn1_add0(ameth); 260 } 261 262int EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id, int *ppkey_flags, 263 const char **pinfo, const char **ppem_str, 264 const EVP_PKEY_ASN1_METHOD *ameth) 265 { 266 if (!ameth) 267 return 0; 268 if (ppkey_id) 269 *ppkey_id = ameth->pkey_id; 270 if (ppkey_base_id) 271 *ppkey_base_id = ameth->pkey_base_id; 272 if (ppkey_flags) 273 *ppkey_flags = ameth->pkey_flags; 274 if (pinfo) 275 *pinfo = ameth->info; 276 if (ppem_str) 277 *ppem_str = ameth->pem_str; 278 return 1; 279 } 280 281const EVP_PKEY_ASN1_METHOD* EVP_PKEY_get0_asn1(EVP_PKEY *pkey) 282 { 283 return pkey->ameth; 284 } 285 286EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags, 287 const char *pem_str, const char *info) 288 { 289 EVP_PKEY_ASN1_METHOD *ameth; 290 ameth = OPENSSL_malloc(sizeof(EVP_PKEY_ASN1_METHOD)); 291 if (!ameth) 292 return NULL; 293 294 ameth->pkey_id = id; 295 ameth->pkey_base_id = id; 296 ameth->pkey_flags = flags | ASN1_PKEY_DYNAMIC; 297 298 if (info) 299 { 300 ameth->info = BUF_strdup(info); 301 if (!ameth->info) 302 goto err; 303 } 304 305 if (pem_str) 306 { 307 ameth->pem_str = BUF_strdup(pem_str); 308 if (!ameth->pem_str) 309 goto err; 310 } 311 312 ameth->pub_decode = 0; 313 ameth->pub_encode = 0; 314 ameth->pub_cmp = 0; 315 ameth->pub_print = 0; 316 317 ameth->priv_decode = 0; 318 ameth->priv_encode = 0; 319 ameth->priv_print = 0; 320 321 ameth->old_priv_encode = 0; 322 ameth->old_priv_decode = 0; 323 324 ameth->pkey_size = 0; 325 ameth->pkey_bits = 0; 326 327 ameth->param_decode = 0; 328 ameth->param_encode = 0; 329 ameth->param_missing = 0; 330 ameth->param_copy = 0; 331 ameth->param_cmp = 0; 332 ameth->param_print = 0; 333 334 ameth->pkey_free = 0; 335 ameth->pkey_ctrl = 0; 336 337 return ameth; 338 339 err: 340 341 EVP_PKEY_asn1_free(ameth); 342 return NULL; 343 344 } 345 346void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst, 347 const EVP_PKEY_ASN1_METHOD *src) 348 { 349 350 dst->pub_decode = src->pub_decode; 351 dst->pub_encode = src->pub_encode; 352 dst->pub_cmp = src->pub_cmp; 353 dst->pub_print = src->pub_print; 354 355 dst->priv_decode = src->priv_decode; 356 dst->priv_encode = src->priv_encode; 357 dst->priv_print = src->priv_print; 358 359 dst->old_priv_encode = src->old_priv_encode; 360 dst->old_priv_decode = src->old_priv_decode; 361 362 dst->pkey_size = src->pkey_size; 363 dst->pkey_bits = src->pkey_bits; 364 365 dst->param_decode = src->param_decode; 366 dst->param_encode = src->param_encode; 367 dst->param_missing = src->param_missing; 368 dst->param_copy = src->param_copy; 369 dst->param_cmp = src->param_cmp; 370 dst->param_print = src->param_print; 371 372 dst->pkey_free = src->pkey_free; 373 dst->pkey_ctrl = src->pkey_ctrl; 374 375 } 376 377void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth) 378 { 379 if (ameth && (ameth->pkey_flags & ASN1_PKEY_DYNAMIC)) 380 { 381 if (ameth->pem_str) 382 OPENSSL_free(ameth->pem_str); 383 if (ameth->info) 384 OPENSSL_free(ameth->info); 385 OPENSSL_free(ameth); 386 } 387 } 388 389void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth, 390 int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub), 391 int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk), 392 int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b), 393 int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent, 394 ASN1_PCTX *pctx), 395 int (*pkey_size)(const EVP_PKEY *pk), 396 int (*pkey_bits)(const EVP_PKEY *pk)) 397 { 398 ameth->pub_decode = pub_decode; 399 ameth->pub_encode = pub_encode; 400 ameth->pub_cmp = pub_cmp; 401 ameth->pub_print = pub_print; 402 ameth->pkey_size = pkey_size; 403 ameth->pkey_bits = pkey_bits; 404 } 405 406void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth, 407 int (*priv_decode)(EVP_PKEY *pk, PKCS8_PRIV_KEY_INFO *p8inf), 408 int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk), 409 int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent, 410 ASN1_PCTX *pctx)) 411 { 412 ameth->priv_decode = priv_decode; 413 ameth->priv_encode = priv_encode; 414 ameth->priv_print = priv_print; 415 } 416 417void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth, 418 int (*param_decode)(EVP_PKEY *pkey, 419 const unsigned char **pder, int derlen), 420 int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder), 421 int (*param_missing)(const EVP_PKEY *pk), 422 int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from), 423 int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b), 424 int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent, 425 ASN1_PCTX *pctx)) 426 { 427 ameth->param_decode = param_decode; 428 ameth->param_encode = param_encode; 429 ameth->param_missing = param_missing; 430 ameth->param_copy = param_copy; 431 ameth->param_cmp = param_cmp; 432 ameth->param_print = param_print; 433 } 434 435void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth, 436 void (*pkey_free)(EVP_PKEY *pkey)) 437 { 438 ameth->pkey_free = pkey_free; 439 } 440 441void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, 442 int (*pkey_ctrl)(EVP_PKEY *pkey, int op, 443 long arg1, void *arg2)) 444 { 445 ameth->pkey_ctrl = pkey_ctrl; 446 } 447