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