1296341Sdelphij/*
2296341Sdelphij * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
3296341Sdelphij * 2006.
4238384Sjkim */
5238384Sjkim/* ====================================================================
6238384Sjkim * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
7238384Sjkim *
8238384Sjkim * Redistribution and use in source and binary forms, with or without
9238384Sjkim * modification, are permitted provided that the following conditions
10238384Sjkim * are met:
11238384Sjkim *
12238384Sjkim * 1. Redistributions of source code must retain the above copyright
13296341Sdelphij *    notice, this list of conditions and the following disclaimer.
14238384Sjkim *
15238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright
16238384Sjkim *    notice, this list of conditions and the following disclaimer in
17238384Sjkim *    the documentation and/or other materials provided with the
18238384Sjkim *    distribution.
19238384Sjkim *
20238384Sjkim * 3. All advertising materials mentioning features or use of this
21238384Sjkim *    software must display the following acknowledgment:
22238384Sjkim *    "This product includes software developed by the OpenSSL Project
23238384Sjkim *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24238384Sjkim *
25238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26238384Sjkim *    endorse or promote products derived from this software without
27238384Sjkim *    prior written permission. For written permission, please contact
28238384Sjkim *    licensing@OpenSSL.org.
29238384Sjkim *
30238384Sjkim * 5. Products derived from this software may not be called "OpenSSL"
31238384Sjkim *    nor may "OpenSSL" appear in their names without prior written
32238384Sjkim *    permission of the OpenSSL Project.
33238384Sjkim *
34238384Sjkim * 6. Redistributions of any form whatsoever must retain the following
35238384Sjkim *    acknowledgment:
36238384Sjkim *    "This product includes software developed by the OpenSSL Project
37238384Sjkim *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38238384Sjkim *
39238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42238384Sjkim * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE.
51238384Sjkim * ====================================================================
52238384Sjkim *
53238384Sjkim * This product includes cryptographic software written by Eric Young
54238384Sjkim * (eay@cryptsoft.com).  This product includes software written by Tim
55238384Sjkim * Hudson (tjh@cryptsoft.com).
56238384Sjkim *
57238384Sjkim */
58238384Sjkim
59238384Sjkim#include <stdio.h>
60238384Sjkim#include "cryptlib.h"
61238384Sjkim#include <openssl/asn1t.h>
62238384Sjkim#include <openssl/x509.h>
63238384Sjkim#ifndef OPENSSL_NO_ENGINE
64296341Sdelphij# include <openssl/engine.h>
65238384Sjkim#endif
66238384Sjkim#include "asn1_locl.h"
67238384Sjkim
68238384Sjkimextern const EVP_PKEY_ASN1_METHOD rsa_asn1_meths[];
69238384Sjkimextern const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[];
70238384Sjkimextern const EVP_PKEY_ASN1_METHOD dh_asn1_meth;
71238384Sjkimextern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
72238384Sjkimextern const EVP_PKEY_ASN1_METHOD hmac_asn1_meth;
73238384Sjkimextern const EVP_PKEY_ASN1_METHOD cmac_asn1_meth;
74238384Sjkim
75238384Sjkim/* Keep this sorted in type order !! */
76296341Sdelphijstatic const EVP_PKEY_ASN1_METHOD *standard_methods[] = {
77238384Sjkim#ifndef OPENSSL_NO_RSA
78296341Sdelphij    &rsa_asn1_meths[0],
79296341Sdelphij    &rsa_asn1_meths[1],
80238384Sjkim#endif
81238384Sjkim#ifndef OPENSSL_NO_DH
82296341Sdelphij    &dh_asn1_meth,
83238384Sjkim#endif
84238384Sjkim#ifndef OPENSSL_NO_DSA
85296341Sdelphij    &dsa_asn1_meths[0],
86296341Sdelphij    &dsa_asn1_meths[1],
87296341Sdelphij    &dsa_asn1_meths[2],
88296341Sdelphij    &dsa_asn1_meths[3],
89296341Sdelphij    &dsa_asn1_meths[4],
90238384Sjkim#endif
91238384Sjkim#ifndef OPENSSL_NO_EC
92296341Sdelphij    &eckey_asn1_meth,
93238384Sjkim#endif
94296341Sdelphij    &hmac_asn1_meth,
95296341Sdelphij    &cmac_asn1_meth
96296341Sdelphij};
97238384Sjkim
98296341Sdelphijtypedef int sk_cmp_fn_type(const char *const *a, const char *const *b);
99238384SjkimDECLARE_STACK_OF(EVP_PKEY_ASN1_METHOD)
100238384Sjkimstatic STACK_OF(EVP_PKEY_ASN1_METHOD) *app_methods = NULL;
101238384Sjkim
102238384Sjkim#ifdef TEST
103238384Sjkimvoid main()
104296341Sdelphij{
105296341Sdelphij    int i;
106296341Sdelphij    for (i = 0;
107296341Sdelphij         i < sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *); i++)
108296341Sdelphij        fprintf(stderr, "Number %d id=%d (%s)\n", i,
109296341Sdelphij                standard_methods[i]->pkey_id,
110296341Sdelphij                OBJ_nid2sn(standard_methods[i]->pkey_id));
111296341Sdelphij}
112238384Sjkim#endif
113238384Sjkim
114238384SjkimDECLARE_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *,
115296341Sdelphij                           const EVP_PKEY_ASN1_METHOD *, ameth);
116238384Sjkim
117296341Sdelphijstatic int ameth_cmp(const EVP_PKEY_ASN1_METHOD *const *a,
118296341Sdelphij                     const EVP_PKEY_ASN1_METHOD *const *b)
119296341Sdelphij{
120296341Sdelphij    return ((*a)->pkey_id - (*b)->pkey_id);
121296341Sdelphij}
122238384Sjkim
123238384SjkimIMPLEMENT_OBJ_BSEARCH_CMP_FN(const EVP_PKEY_ASN1_METHOD *,
124296341Sdelphij                             const EVP_PKEY_ASN1_METHOD *, ameth);
125238384Sjkim
126238384Sjkimint EVP_PKEY_asn1_get_count(void)
127296341Sdelphij{
128296341Sdelphij    int num = sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *);
129296341Sdelphij    if (app_methods)
130296341Sdelphij        num += sk_EVP_PKEY_ASN1_METHOD_num(app_methods);
131296341Sdelphij    return num;
132296341Sdelphij}
133238384Sjkim
134238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx)
135296341Sdelphij{
136296341Sdelphij    int num = sizeof(standard_methods) / sizeof(EVP_PKEY_ASN1_METHOD *);
137296341Sdelphij    if (idx < 0)
138296341Sdelphij        return NULL;
139296341Sdelphij    if (idx < num)
140296341Sdelphij        return standard_methods[idx];
141296341Sdelphij    idx -= num;
142296341Sdelphij    return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx);
143296341Sdelphij}
144238384Sjkim
145238384Sjkimstatic const EVP_PKEY_ASN1_METHOD *pkey_asn1_find(int type)
146296341Sdelphij{
147296341Sdelphij    EVP_PKEY_ASN1_METHOD tmp;
148296341Sdelphij    const EVP_PKEY_ASN1_METHOD *t = &tmp, **ret;
149296341Sdelphij    tmp.pkey_id = type;
150296341Sdelphij    if (app_methods) {
151296341Sdelphij        int idx;
152296341Sdelphij        idx = sk_EVP_PKEY_ASN1_METHOD_find(app_methods, &tmp);
153296341Sdelphij        if (idx >= 0)
154296341Sdelphij            return sk_EVP_PKEY_ASN1_METHOD_value(app_methods, idx);
155296341Sdelphij    }
156296341Sdelphij    ret = OBJ_bsearch_ameth(&t, standard_methods, sizeof(standard_methods)
157296341Sdelphij                            / sizeof(EVP_PKEY_ASN1_METHOD *));
158296341Sdelphij    if (!ret || !*ret)
159296341Sdelphij        return NULL;
160296341Sdelphij    return *ret;
161296341Sdelphij}
162238384Sjkim
163296341Sdelphij/*
164296341Sdelphij * Find an implementation of an ASN1 algorithm. If 'pe' is not NULL also
165296341Sdelphij * search through engines and set *pe to a functional reference to the engine
166296341Sdelphij * implementing 'type' or NULL if no engine implements it.
167238384Sjkim */
168238384Sjkim
169238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(ENGINE **pe, int type)
170296341Sdelphij{
171296341Sdelphij    const EVP_PKEY_ASN1_METHOD *t;
172238384Sjkim
173296341Sdelphij    for (;;) {
174296341Sdelphij        t = pkey_asn1_find(type);
175296341Sdelphij        if (!t || !(t->pkey_flags & ASN1_PKEY_ALIAS))
176296341Sdelphij            break;
177296341Sdelphij        type = t->pkey_base_id;
178296341Sdelphij    }
179296341Sdelphij    if (pe) {
180238384Sjkim#ifndef OPENSSL_NO_ENGINE
181296341Sdelphij        ENGINE *e;
182296341Sdelphij        /* type will contain the final unaliased type */
183296341Sdelphij        e = ENGINE_get_pkey_asn1_meth_engine(type);
184296341Sdelphij        if (e) {
185296341Sdelphij            *pe = e;
186296341Sdelphij            return ENGINE_get_pkey_asn1_meth(e, type);
187296341Sdelphij        }
188238384Sjkim#endif
189296341Sdelphij        *pe = NULL;
190296341Sdelphij    }
191296341Sdelphij    return t;
192296341Sdelphij}
193238384Sjkim
194238384Sjkimconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(ENGINE **pe,
195296341Sdelphij                                                   const char *str, int len)
196296341Sdelphij{
197296341Sdelphij    int i;
198296341Sdelphij    const EVP_PKEY_ASN1_METHOD *ameth;
199296341Sdelphij    if (len == -1)
200296341Sdelphij        len = strlen(str);
201296341Sdelphij    if (pe) {
202238384Sjkim#ifndef OPENSSL_NO_ENGINE
203296341Sdelphij        ENGINE *e;
204296341Sdelphij        ameth = ENGINE_pkey_asn1_find_str(&e, str, len);
205296341Sdelphij        if (ameth) {
206296341Sdelphij            /*
207296341Sdelphij             * Convert structural into functional reference
208296341Sdelphij             */
209296341Sdelphij            if (!ENGINE_init(e))
210296341Sdelphij                ameth = NULL;
211296341Sdelphij            ENGINE_free(e);
212296341Sdelphij            *pe = e;
213296341Sdelphij            return ameth;
214296341Sdelphij        }
215238384Sjkim#endif
216296341Sdelphij        *pe = NULL;
217296341Sdelphij    }
218296341Sdelphij    for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) {
219296341Sdelphij        ameth = EVP_PKEY_asn1_get0(i);
220296341Sdelphij        if (ameth->pkey_flags & ASN1_PKEY_ALIAS)
221296341Sdelphij            continue;
222296341Sdelphij        if (((int)strlen(ameth->pem_str) == len) &&
223296341Sdelphij            !strncasecmp(ameth->pem_str, str, len))
224296341Sdelphij            return ameth;
225296341Sdelphij    }
226296341Sdelphij    return NULL;
227296341Sdelphij}
228238384Sjkim
229238384Sjkimint EVP_PKEY_asn1_add0(const EVP_PKEY_ASN1_METHOD *ameth)
230296341Sdelphij{
231296341Sdelphij    if (app_methods == NULL) {
232296341Sdelphij        app_methods = sk_EVP_PKEY_ASN1_METHOD_new(ameth_cmp);
233296341Sdelphij        if (!app_methods)
234296341Sdelphij            return 0;
235296341Sdelphij    }
236296341Sdelphij    if (!sk_EVP_PKEY_ASN1_METHOD_push(app_methods, ameth))
237296341Sdelphij        return 0;
238296341Sdelphij    sk_EVP_PKEY_ASN1_METHOD_sort(app_methods);
239296341Sdelphij    return 1;
240296341Sdelphij}
241238384Sjkim
242238384Sjkimint EVP_PKEY_asn1_add_alias(int to, int from)
243296341Sdelphij{
244296341Sdelphij    EVP_PKEY_ASN1_METHOD *ameth;
245296341Sdelphij    ameth = EVP_PKEY_asn1_new(from, ASN1_PKEY_ALIAS, NULL, NULL);
246296341Sdelphij    if (!ameth)
247296341Sdelphij        return 0;
248296341Sdelphij    ameth->pkey_base_id = to;
249296341Sdelphij    if (!EVP_PKEY_asn1_add0(ameth)) {
250296341Sdelphij        EVP_PKEY_asn1_free(ameth);
251296341Sdelphij        return 0;
252296341Sdelphij    }
253296341Sdelphij    return 1;
254296341Sdelphij}
255238384Sjkim
256296341Sdelphijint EVP_PKEY_asn1_get0_info(int *ppkey_id, int *ppkey_base_id,
257296341Sdelphij                            int *ppkey_flags, const char **pinfo,
258296341Sdelphij                            const char **ppem_str,
259296341Sdelphij                            const EVP_PKEY_ASN1_METHOD *ameth)
260296341Sdelphij{
261296341Sdelphij    if (!ameth)
262296341Sdelphij        return 0;
263296341Sdelphij    if (ppkey_id)
264296341Sdelphij        *ppkey_id = ameth->pkey_id;
265296341Sdelphij    if (ppkey_base_id)
266296341Sdelphij        *ppkey_base_id = ameth->pkey_base_id;
267296341Sdelphij    if (ppkey_flags)
268296341Sdelphij        *ppkey_flags = ameth->pkey_flags;
269296341Sdelphij    if (pinfo)
270296341Sdelphij        *pinfo = ameth->info;
271296341Sdelphij    if (ppem_str)
272296341Sdelphij        *ppem_str = ameth->pem_str;
273296341Sdelphij    return 1;
274296341Sdelphij}
275238384Sjkim
276296341Sdelphijconst EVP_PKEY_ASN1_METHOD *EVP_PKEY_get0_asn1(EVP_PKEY *pkey)
277296341Sdelphij{
278296341Sdelphij    return pkey->ameth;
279296341Sdelphij}
280238384Sjkim
281296341SdelphijEVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags,
282296341Sdelphij                                        const char *pem_str, const char *info)
283296341Sdelphij{
284296341Sdelphij    EVP_PKEY_ASN1_METHOD *ameth;
285296341Sdelphij    ameth = OPENSSL_malloc(sizeof(EVP_PKEY_ASN1_METHOD));
286296341Sdelphij    if (!ameth)
287296341Sdelphij        return NULL;
288238384Sjkim
289296341Sdelphij    memset(ameth, 0, sizeof(EVP_PKEY_ASN1_METHOD));
290238384Sjkim
291296341Sdelphij    ameth->pkey_id = id;
292296341Sdelphij    ameth->pkey_base_id = id;
293296341Sdelphij    ameth->pkey_flags = flags | ASN1_PKEY_DYNAMIC;
294238384Sjkim
295296341Sdelphij    if (info) {
296296341Sdelphij        ameth->info = BUF_strdup(info);
297296341Sdelphij        if (!ameth->info)
298296341Sdelphij            goto err;
299296341Sdelphij    } else
300296341Sdelphij        ameth->info = NULL;
301238384Sjkim
302296341Sdelphij    if (pem_str) {
303296341Sdelphij        ameth->pem_str = BUF_strdup(pem_str);
304296341Sdelphij        if (!ameth->pem_str)
305296341Sdelphij            goto err;
306296341Sdelphij    } else
307296341Sdelphij        ameth->pem_str = NULL;
308238384Sjkim
309296341Sdelphij    ameth->pub_decode = 0;
310296341Sdelphij    ameth->pub_encode = 0;
311296341Sdelphij    ameth->pub_cmp = 0;
312296341Sdelphij    ameth->pub_print = 0;
313238384Sjkim
314296341Sdelphij    ameth->priv_decode = 0;
315296341Sdelphij    ameth->priv_encode = 0;
316296341Sdelphij    ameth->priv_print = 0;
317238384Sjkim
318296341Sdelphij    ameth->old_priv_encode = 0;
319296341Sdelphij    ameth->old_priv_decode = 0;
320238384Sjkim
321296341Sdelphij    ameth->item_verify = 0;
322296341Sdelphij    ameth->item_sign = 0;
323238384Sjkim
324296341Sdelphij    ameth->pkey_size = 0;
325296341Sdelphij    ameth->pkey_bits = 0;
326238384Sjkim
327296341Sdelphij    ameth->param_decode = 0;
328296341Sdelphij    ameth->param_encode = 0;
329296341Sdelphij    ameth->param_missing = 0;
330296341Sdelphij    ameth->param_copy = 0;
331296341Sdelphij    ameth->param_cmp = 0;
332296341Sdelphij    ameth->param_print = 0;
333238384Sjkim
334296341Sdelphij    ameth->pkey_free = 0;
335296341Sdelphij    ameth->pkey_ctrl = 0;
336238384Sjkim
337296341Sdelphij    return ameth;
338238384Sjkim
339296341Sdelphij err:
340238384Sjkim
341296341Sdelphij    EVP_PKEY_asn1_free(ameth);
342296341Sdelphij    return NULL;
343238384Sjkim
344296341Sdelphij}
345238384Sjkim
346296341Sdelphijvoid EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD *dst,
347296341Sdelphij                        const EVP_PKEY_ASN1_METHOD *src)
348296341Sdelphij{
349238384Sjkim
350296341Sdelphij    dst->pub_decode = src->pub_decode;
351296341Sdelphij    dst->pub_encode = src->pub_encode;
352296341Sdelphij    dst->pub_cmp = src->pub_cmp;
353296341Sdelphij    dst->pub_print = src->pub_print;
354238384Sjkim
355296341Sdelphij    dst->priv_decode = src->priv_decode;
356296341Sdelphij    dst->priv_encode = src->priv_encode;
357296341Sdelphij    dst->priv_print = src->priv_print;
358238384Sjkim
359296341Sdelphij    dst->old_priv_encode = src->old_priv_encode;
360296341Sdelphij    dst->old_priv_decode = src->old_priv_decode;
361238384Sjkim
362296341Sdelphij    dst->pkey_size = src->pkey_size;
363296341Sdelphij    dst->pkey_bits = src->pkey_bits;
364238384Sjkim
365296341Sdelphij    dst->param_decode = src->param_decode;
366296341Sdelphij    dst->param_encode = src->param_encode;
367296341Sdelphij    dst->param_missing = src->param_missing;
368296341Sdelphij    dst->param_copy = src->param_copy;
369296341Sdelphij    dst->param_cmp = src->param_cmp;
370296341Sdelphij    dst->param_print = src->param_print;
371238384Sjkim
372296341Sdelphij    dst->pkey_free = src->pkey_free;
373296341Sdelphij    dst->pkey_ctrl = src->pkey_ctrl;
374238384Sjkim
375296341Sdelphij    dst->item_sign = src->item_sign;
376296341Sdelphij    dst->item_verify = src->item_verify;
377238384Sjkim
378296341Sdelphij}
379238384Sjkim
380238384Sjkimvoid EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD *ameth)
381296341Sdelphij{
382296341Sdelphij    if (ameth && (ameth->pkey_flags & ASN1_PKEY_DYNAMIC)) {
383296341Sdelphij        if (ameth->pem_str)
384296341Sdelphij            OPENSSL_free(ameth->pem_str);
385296341Sdelphij        if (ameth->info)
386296341Sdelphij            OPENSSL_free(ameth->info);
387296341Sdelphij        OPENSSL_free(ameth);
388296341Sdelphij    }
389296341Sdelphij}
390238384Sjkim
391238384Sjkimvoid EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD *ameth,
392296341Sdelphij                              int (*pub_decode) (EVP_PKEY *pk,
393296341Sdelphij                                                 X509_PUBKEY *pub),
394296341Sdelphij                              int (*pub_encode) (X509_PUBKEY *pub,
395296341Sdelphij                                                 const EVP_PKEY *pk),
396296341Sdelphij                              int (*pub_cmp) (const EVP_PKEY *a,
397296341Sdelphij                                              const EVP_PKEY *b),
398296341Sdelphij                              int (*pub_print) (BIO *out,
399296341Sdelphij                                                const EVP_PKEY *pkey,
400296341Sdelphij                                                int indent, ASN1_PCTX *pctx),
401296341Sdelphij                              int (*pkey_size) (const EVP_PKEY *pk),
402296341Sdelphij                              int (*pkey_bits) (const EVP_PKEY *pk))
403296341Sdelphij{
404296341Sdelphij    ameth->pub_decode = pub_decode;
405296341Sdelphij    ameth->pub_encode = pub_encode;
406296341Sdelphij    ameth->pub_cmp = pub_cmp;
407296341Sdelphij    ameth->pub_print = pub_print;
408296341Sdelphij    ameth->pkey_size = pkey_size;
409296341Sdelphij    ameth->pkey_bits = pkey_bits;
410296341Sdelphij}
411238384Sjkim
412238384Sjkimvoid EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD *ameth,
413296341Sdelphij                               int (*priv_decode) (EVP_PKEY *pk,
414296341Sdelphij                                                   PKCS8_PRIV_KEY_INFO
415296341Sdelphij                                                   *p8inf),
416296341Sdelphij                               int (*priv_encode) (PKCS8_PRIV_KEY_INFO *p8,
417296341Sdelphij                                                   const EVP_PKEY *pk),
418296341Sdelphij                               int (*priv_print) (BIO *out,
419296341Sdelphij                                                  const EVP_PKEY *pkey,
420296341Sdelphij                                                  int indent,
421296341Sdelphij                                                  ASN1_PCTX *pctx))
422296341Sdelphij{
423296341Sdelphij    ameth->priv_decode = priv_decode;
424296341Sdelphij    ameth->priv_encode = priv_encode;
425296341Sdelphij    ameth->priv_print = priv_print;
426296341Sdelphij}
427238384Sjkim
428238384Sjkimvoid EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD *ameth,
429296341Sdelphij                             int (*param_decode) (EVP_PKEY *pkey,
430296341Sdelphij                                                  const unsigned char **pder,
431296341Sdelphij                                                  int derlen),
432296341Sdelphij                             int (*param_encode) (const EVP_PKEY *pkey,
433296341Sdelphij                                                  unsigned char **pder),
434296341Sdelphij                             int (*param_missing) (const EVP_PKEY *pk),
435296341Sdelphij                             int (*param_copy) (EVP_PKEY *to,
436296341Sdelphij                                                const EVP_PKEY *from),
437296341Sdelphij                             int (*param_cmp) (const EVP_PKEY *a,
438296341Sdelphij                                               const EVP_PKEY *b),
439296341Sdelphij                             int (*param_print) (BIO *out,
440296341Sdelphij                                                 const EVP_PKEY *pkey,
441296341Sdelphij                                                 int indent, ASN1_PCTX *pctx))
442296341Sdelphij{
443296341Sdelphij    ameth->param_decode = param_decode;
444296341Sdelphij    ameth->param_encode = param_encode;
445296341Sdelphij    ameth->param_missing = param_missing;
446296341Sdelphij    ameth->param_copy = param_copy;
447296341Sdelphij    ameth->param_cmp = param_cmp;
448296341Sdelphij    ameth->param_print = param_print;
449296341Sdelphij}
450238384Sjkim
451238384Sjkimvoid EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD *ameth,
452296341Sdelphij                            void (*pkey_free) (EVP_PKEY *pkey))
453296341Sdelphij{
454296341Sdelphij    ameth->pkey_free = pkey_free;
455296341Sdelphij}
456238384Sjkim
457238384Sjkimvoid EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth,
458296341Sdelphij                            int (*pkey_ctrl) (EVP_PKEY *pkey, int op,
459296341Sdelphij                                              long arg1, void *arg2))
460296341Sdelphij{
461296341Sdelphij    ameth->pkey_ctrl = pkey_ctrl;
462296341Sdelphij}
463