1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * All rights reserved.
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This package is an SSL implementation written
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * by Eric Young (eay@cryptsoft.com).
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The implementation was written so as to conform with Netscapes SSL.
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This library is free for commercial and non-commercial use as long as
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the following conditions are aheared to.  The following conditions
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * apply to all code found in this distribution, be it the RC4, RSA,
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * included with this distribution is covered by the same copyright terms
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright remains Eric Young's, and as such any Copyright notices in
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the code are not to be removed.
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * If this package is used in a product, Eric Young should be given attribution
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * as the author of the parts of the library used.
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This can be in the form of a textual message at program startup or
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * in documentation (online or textual) provided with the package.
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met:
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the copyright
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer.
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer in the
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    documentation and/or other materials provided with the distribution.
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this software
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    must display the following acknowledgement:
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes cryptographic software written by
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *     Eric Young (eay@cryptsoft.com)"
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    The word 'cryptographic' can be left out if the rouines from the library
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    being used are not cryptographic related :-).
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. If you include any Windows specific code (or a derivative thereof) from
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    the apps directory (application code) you must include an acknowledgement:
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SUCH DAMAGE.
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The licence and distribution terms for any publically available version or
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * derivative of this code cannot be changed.  i.e. this code cannot simply be
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copied and put under another distribution licence
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * [including the GNU Public Licence.] */
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifndef OPENSSL_HEADER_EVP_INTERNAL_H
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define OPENSSL_HEADER_EVP_INTERNAL_H
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/base.h>
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus)
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyextern "C" {
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* These values are flags for EVP_PKEY_ASN1_METHOD.flags. */
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* ASN1_PKEY_SIGPARAM_NULL controls whether the default behavior of
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * EVP_DigestSignAlgorithm writes an explicit NULL parameter in the
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * AlgorithmIdentifier. */
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define ASN1_PKEY_SIGPARAM_NULL 0x1
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* evp_digest_sign_algorithm_result_t is the return value of the
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * digest_sign_algorithm function in EVP_PKEY_ASN1_METHOD. */
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langleytypedef enum {
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* EVP_DIGEST_SIGN_ALGORITHM_ERROR signals an error. */
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  EVP_DIGEST_SIGN_ALGORITHM_ERROR = 0,
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* EVP_DIGEST_SIGN_ALGORITHM_SUCCESS signals that the parameters were
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * serialized in the AlgorithmIdentifier. */
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  EVP_DIGEST_SIGN_ALGORITHM_SUCCESS = 1,
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* EVP_DIGEST_SIGN_ALGORITHM_DEFAULT signals that the parameters are
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * serialized using the default behavior. */
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  EVP_DIGEST_SIGN_ALGORITHM_DEFAULT = 2,
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} evp_digest_sign_algorithm_result_t;
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct evp_pkey_asn1_method_st {
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int pkey_id;
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int pkey_base_id;
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  unsigned long pkey_flags;
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  char *pem_str;
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  char *info;
94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub);
96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk);
97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent, ASN1_PCTX *pctx);
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*priv_decode)(EVP_PKEY *pk, PKCS8_PRIV_KEY_INFO *p8inf);
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk);
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent,
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                    ASN1_PCTX *pctx);
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* pkey_opaque returns 1 if the |pk| is opaque. Opaque keys are backed by
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * custom implementations which do not expose key material and parameters.*/
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pkey_opaque)(const EVP_PKEY *pk);
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* pkey_supports_digest returns one if |pkey| supports digests of
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * type |md|. This is intended for use with EVP_PKEYs backing custom
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * implementations which can't sign all digests. If null, it is
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   * assumed that all digests are supported. */
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pkey_supports_digest)(const EVP_PKEY *pkey, const EVP_MD *md);
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pkey_size)(const EVP_PKEY *pk);
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*pkey_bits)(const EVP_PKEY *pk);
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_decode)(EVP_PKEY *pkey, const unsigned char **pder, int derlen);
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder);
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_missing)(const EVP_PKEY *pk);
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from);
122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent,
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                     ASN1_PCTX *pctx);
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*sig_print)(BIO *out, const X509_ALGOR *sigalg, const ASN1_STRING *sig,
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                   int indent, ASN1_PCTX *pctx);
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  void (*pkey_free)(EVP_PKEY *pkey);
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Legacy functions for old PEM */
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*old_priv_decode)(EVP_PKEY *pkey, const unsigned char **pder,
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                         int derlen);
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*old_priv_encode)(const EVP_PKEY *pkey, unsigned char **pder);
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Converting parameters to/from AlgorithmIdentifier (X509_ALGOR). */
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*digest_verify_init_from_algorithm)(EVP_MD_CTX *ctx,
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                           X509_ALGOR *algor,
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                           EVP_PKEY *pkey);
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  evp_digest_sign_algorithm_result_t (*digest_sign_algorithm)(
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      EVP_MD_CTX *ctx,
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      X509_ALGOR *algor);
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} /* EVP_PKEY_ASN1_METHOD */;
146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langleytypedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx);
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_UNDEFINED 0
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_PARAMGEN (1 << 1)
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_KEYGEN (1 << 2)
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_SIGN (1 << 3)
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_VERIFY (1 << 4)
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_VERIFYRECOVER (1 << 5)
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_SIGNCTX (1 << 6)
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_VERIFYCTX (1 << 7)
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_ENCRYPT (1 << 8)
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_DECRYPT (1 << 9)
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_DERIVE (1 << 10)
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_TYPE_SIG                                           \
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER | \
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley   EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX)
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_TYPE_CRYPT (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT)
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_TYPE_NOGEN \
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE)
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_OP_TYPE_GEN (EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN)
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
173e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* EVP_PKEY_CTX_ctrl performs |cmd| on |ctx|. The |keytype| and |optype|
174e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * arguments can be -1 to specify that any type and operation are acceptable,
175e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * otherwise |keytype| must match the type of |ctx| and the bits of |optype|
176e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * must intersect the operation flags set on |ctx|.
177e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *
178e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * The |p1| and |p2| arguments depend on the value of |cmd|.
179e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *
180e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * It returns one on success and zero on error. */
181e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyOPENSSL_EXPORT int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
182e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley                                     int cmd, int p1, void *p2);
183e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
184e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* EVP_PKEY_CTRL_DIGESTINIT is an internal value. It's called by
185e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * EVP_DigestInit_ex to signal the |EVP_PKEY| that a digest operation is
186e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * starting.
187e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *
188e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * TODO(davidben): This is only needed to support the deprecated HMAC |EVP_PKEY|
189e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * types. */
190e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#define EVP_PKEY_CTRL_DIGESTINIT 3
191e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
192e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* EVP_PKEY_CTRL_PEER_KEY is called with different values of |p1|:
193e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *   0: Is called from |EVP_PKEY_derive_set_peer| and |p2| contains a peer key.
194e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *      If the return value is <= 0, the key is rejected.
195e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *   1: Is called at the end of |EVP_PKEY_derive_set_peer| and |p2| contains a
196e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *      peer key. If the return value is <= 0, the key is rejected.
197e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *   2: Is called with |p2| == NULL to test whether the peer's key was used.
198e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *      (EC)DH always return one in this case.
199e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *   3: Is called with |p2| == NULL to set whether the peer's key was used.
200e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley *      (EC)DH always return one in this case. This was only used for GOST. */
201e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#define EVP_PKEY_CTRL_PEER_KEY 4
202e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
203e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* EVP_PKEY_CTRL_SET_MAC_KEY sets a MAC key. For example, this can be done an
204e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * |EVP_PKEY_CTX| prior to calling |EVP_PKEY_keygen| in order to generate an
205e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * HMAC |EVP_PKEY| with the given key. It returns one on success and zero on
206e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * error. */
207e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#define EVP_PKEY_CTRL_SET_MAC_KEY 5
208e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
209e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley/* EVP_PKEY_ALG_CTRL is the base value from which key-type specific ctrl
210e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley * commands are numbered. */
211e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#define EVP_PKEY_ALG_CTRL 0x1000
212e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_MD 1
214d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_MD 2
215e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1)
217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 2)
218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 3)
219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 4)
220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 5)
221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP	(EVP_PKEY_ALG_CTRL + 6)
222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 7)
223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 8)
224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 9)
225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 10)
226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 11)
227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12)
228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
229e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#define EVP_PKEY_CTRL_EC_PARAMGEN_CURVE_NID (EVP_PKEY_ALG_CTRL + 1)
230e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
231d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct evp_pkey_ctx_st {
232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Method associated with this operation */
233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const EVP_PKEY_METHOD *pmeth;
234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Engine that implements this method or NULL if builtin */
235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ENGINE *engine;
236d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Key: may be NULL */
237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  EVP_PKEY *pkey;
238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Peer key for key agreement, may be NULL */
239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  EVP_PKEY *peerkey;
240d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* operation contains one of the |EVP_PKEY_OP_*| values. */
241d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int operation;
242d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Algorithm specific data */
243d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  void *data;
244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  /* Application specific data */
245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  void *app_data;
246d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} /* EVP_PKEY_CTX */;
247d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
248d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystruct evp_pkey_method_st {
249d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int pkey_id;
250d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int flags;
251d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
252d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*init)(EVP_PKEY_CTX *ctx);
253d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
254d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  void (*cleanup)(EVP_PKEY_CTX *ctx);
255d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
256d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*paramgen_init)(EVP_PKEY_CTX *ctx);
257d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
258d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
259d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*keygen_init)(EVP_PKEY_CTX *ctx);
260d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
261d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
262d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*sign_init)(EVP_PKEY_CTX *ctx);
263d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
264d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              const unsigned char *tbs, size_t tbslen);
265d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
266d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*verify_init)(EVP_PKEY_CTX *ctx);
267d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen,
268d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                const unsigned char *tbs, size_t tbslen);
269d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
270d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
271d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
272d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                 EVP_MD_CTX *mctx);
273d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
274d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx);
275d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig, int siglen,
276d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                   EVP_MD_CTX *mctx);
277d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
278d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*encrypt_init)(EVP_PKEY_CTX *ctx);
279d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*encrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
280d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                 const unsigned char *in, size_t inlen);
281d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
282d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*decrypt_init)(EVP_PKEY_CTX *ctx);
283d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
284d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                 const unsigned char *in, size_t inlen);
285d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
286d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*derive_init)(EVP_PKEY_CTX *ctx);
287d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
288d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
289d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
290d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value);
291d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} /* EVP_PKEY_METHOD */;
292d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
293d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
294d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus)
295d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}  /* extern C */
296d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif
297d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
298d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif  /* OPENSSL_HEADER_EVP_INTERNAL_H */
299