1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com) 2 * All rights reserved. 3 * 4 * This package is an SSL implementation written 5 * by Eric Young (eay (at) cryptsoft.com). 6 * The implementation was written so as to conform with Netscapes SSL. 7 * 8 * This library is free for commercial and non-commercial use as long as 9 * the following conditions are aheared to. The following conditions 10 * apply to all code found in this distribution, be it the RC4, RSA, 11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * included with this distribution is covered by the same copyright terms 13 * except that the holder is Tim Hudson (tjh (at) cryptsoft.com). 14 * 15 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * the code are not to be removed. 17 * If this package is used in a product, Eric Young should be given attribution 18 * as the author of the parts of the library used. 19 * This can be in the form of a textual message at program startup or 20 * in documentation (online or textual) provided with the package. 21 * 22 * Redistribution and use in source and binary forms, with or without 23 * modification, are permitted provided that the following conditions 24 * are met: 25 * 1. Redistributions of source code must retain the copyright 26 * notice, this list of conditions and the following disclaimer. 27 * 2. Redistributions in binary form must reproduce the above copyright 28 * notice, this list of conditions and the following disclaimer in the 29 * documentation and/or other materials provided with the distribution. 30 * 3. All advertising materials mentioning features or use of this software 31 * must display the following acknowledgement: 32 * "This product includes cryptographic software written by 33 * Eric Young (eay (at) cryptsoft.com)" 34 * The word 'cryptographic' can be left out if the rouines from the library 35 * being used are not cryptographic related :-). 36 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * the apps directory (application code) you must include an acknowledgement: 38 * "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)" 39 * 40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * SUCH DAMAGE. 51 * 52 * The licence and distribution terms for any publically available version or 53 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * copied and put under another distribution licence 55 * [including the GNU Public Licence.] */ 56 57 #include <openssl/evp.h> 58 59 #include <string.h> 60 61 #include <openssl/digest.h> 62 #include <openssl/err.h> 63 #include <openssl/mem.h> 64 65 #include "../internal.h" 66 #include "internal.h" 67 68 69 static const EVP_PKEY_METHOD *const evp_methods[] = { 70 &rsa_pkey_meth, 71 &ec_pkey_meth, 72 &ed25519_pkey_meth, 73 }; 74 75 static const EVP_PKEY_METHOD *evp_pkey_meth_find(int type) { 76 unsigned i; 77 78 for (i = 0; i < sizeof(evp_methods)/sizeof(EVP_PKEY_METHOD*); i++) { 79 if (evp_methods[i]->pkey_id == type) { 80 return evp_methods[i]; 81 } 82 } 83 84 return NULL; 85 } 86 87 static EVP_PKEY_CTX *evp_pkey_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id) { 88 EVP_PKEY_CTX *ret; 89 const EVP_PKEY_METHOD *pmeth; 90 91 if (id == -1) { 92 if (!pkey || !pkey->ameth) { 93 return NULL; 94 } 95 id = pkey->ameth->pkey_id; 96 } 97 98 pmeth = evp_pkey_meth_find(id); 99 100 if (pmeth == NULL) { 101 OPENSSL_PUT_ERROR(EVP, EVP_R_UNSUPPORTED_ALGORITHM); 102 ERR_add_error_dataf("algorithm %d", id); 103 return NULL; 104 } 105 106 ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 107 if (!ret) { 108 OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE); 109 return NULL; 110 } 111 OPENSSL_memset(ret, 0, sizeof(EVP_PKEY_CTX)); 112 113 ret->engine = e; 114 ret->pmeth = pmeth; 115 ret->operation = EVP_PKEY_OP_UNDEFINED; 116 117 if (pkey) { 118 EVP_PKEY_up_ref(pkey); 119 ret->pkey = pkey; 120 } 121 122 if (pmeth->init) { 123 if (pmeth->init(ret) <= 0) { 124 EVP_PKEY_free(ret->pkey); 125 OPENSSL_free(ret); 126 return NULL; 127 } 128 } 129 130 return ret; 131 } 132 133 EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *pkey, ENGINE *e) { 134 return evp_pkey_ctx_new(pkey, e, -1); 135 } 136 137 EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int id, ENGINE *e) { 138 return evp_pkey_ctx_new(NULL, e, id); 139 } 140 141 void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx) { 142 if (ctx == NULL) { 143 return; 144 } 145 if (ctx->pmeth && ctx->pmeth->cleanup) { 146 ctx->pmeth->cleanup(ctx); 147 } 148 EVP_PKEY_free(ctx->pkey); 149 EVP_PKEY_free(ctx->peerkey); 150 OPENSSL_free(ctx); 151 } 152 153 EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *ctx) { 154 if (!ctx->pmeth || !ctx->pmeth->copy) { 155 return NULL; 156 } 157 158 EVP_PKEY_CTX *ret = OPENSSL_malloc(sizeof(EVP_PKEY_CTX)); 159 if (!ret) { 160 return NULL; 161 } 162 163 OPENSSL_memset(ret, 0, sizeof(EVP_PKEY_CTX)); 164 165 ret->pmeth = ctx->pmeth; 166 ret->engine = ctx->engine; 167 ret->operation = ctx->operation; 168 169 if (ctx->pkey != NULL) { 170 EVP_PKEY_up_ref(ctx->pkey); 171 ret->pkey = ctx->pkey; 172 } 173 174 if (ctx->peerkey != NULL) { 175 EVP_PKEY_up_ref(ctx->peerkey); 176 ret->peerkey = ctx->peerkey; 177 } 178 179 if (ctx->pmeth->copy(ret, ctx) <= 0) { 180 ret->pmeth = NULL; 181 EVP_PKEY_CTX_free(ret); 182 OPENSSL_PUT_ERROR(EVP, ERR_LIB_EVP); 183 return NULL; 184 } 185 186 return ret; 187 } 188 189 EVP_PKEY *EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX *ctx) { return ctx->pkey; } 190 191 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype, int cmd, 192 int p1, void *p2) { 193 if (!ctx || !ctx->pmeth || !ctx->pmeth->ctrl) { 194 OPENSSL_PUT_ERROR(EVP, EVP_R_COMMAND_NOT_SUPPORTED); 195 return 0; 196 } 197 if (keytype != -1 && ctx->pmeth->pkey_id != keytype) { 198 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 199 return 0; 200 } 201 202 if (ctx->operation == EVP_PKEY_OP_UNDEFINED) { 203 OPENSSL_PUT_ERROR(EVP, EVP_R_NO_OPERATION_SET); 204 return 0; 205 } 206 207 if (optype != -1 && !(ctx->operation & optype)) { 208 OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_OPERATION); 209 return 0; 210 } 211 212 return ctx->pmeth->ctrl(ctx, cmd, p1, p2); 213 } 214 215 int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx) { 216 if (ctx == NULL || ctx->pmeth == NULL || 217 (ctx->pmeth->sign == NULL && ctx->pmeth->sign_message == NULL)) { 218 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 219 return 0; 220 } 221 222 ctx->operation = EVP_PKEY_OP_SIGN; 223 return 1; 224 } 225 226 int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *sig_len, 227 const uint8_t *digest, size_t digest_len) { 228 if (!ctx || !ctx->pmeth || !ctx->pmeth->sign) { 229 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 230 return 0; 231 } 232 if (ctx->operation != EVP_PKEY_OP_SIGN) { 233 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 234 return 0; 235 } 236 return ctx->pmeth->sign(ctx, sig, sig_len, digest, digest_len); 237 } 238 239 int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx) { 240 if (ctx == NULL || ctx->pmeth == NULL || 241 (ctx->pmeth->verify == NULL && ctx->pmeth->verify_message == NULL)) { 242 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 243 return 0; 244 } 245 ctx->operation = EVP_PKEY_OP_VERIFY; 246 return 1; 247 } 248 249 int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t sig_len, 250 const uint8_t *digest, size_t digest_len) { 251 if (!ctx || !ctx->pmeth || !ctx->pmeth->verify) { 252 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 253 return 0; 254 } 255 if (ctx->operation != EVP_PKEY_OP_VERIFY) { 256 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 257 return 0; 258 } 259 return ctx->pmeth->verify(ctx, sig, sig_len, digest, digest_len); 260 } 261 262 int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx) { 263 if (!ctx || !ctx->pmeth || !ctx->pmeth->encrypt) { 264 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 265 return 0; 266 } 267 ctx->operation = EVP_PKEY_OP_ENCRYPT; 268 return 1; 269 } 270 271 int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen, 272 const uint8_t *in, size_t inlen) { 273 if (!ctx || !ctx->pmeth || !ctx->pmeth->encrypt) { 274 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 275 return 0; 276 } 277 if (ctx->operation != EVP_PKEY_OP_ENCRYPT) { 278 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 279 return 0; 280 } 281 return ctx->pmeth->encrypt(ctx, out, outlen, in, inlen); 282 } 283 284 int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx) { 285 if (!ctx || !ctx->pmeth || !ctx->pmeth->decrypt) { 286 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 287 return 0; 288 } 289 ctx->operation = EVP_PKEY_OP_DECRYPT; 290 return 1; 291 } 292 293 int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen, 294 const uint8_t *in, size_t inlen) { 295 if (!ctx || !ctx->pmeth || !ctx->pmeth->decrypt) { 296 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 297 return 0; 298 } 299 if (ctx->operation != EVP_PKEY_OP_DECRYPT) { 300 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 301 return 0; 302 } 303 return ctx->pmeth->decrypt(ctx, out, outlen, in, inlen); 304 } 305 306 int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx) { 307 if (!ctx || !ctx->pmeth || !ctx->pmeth->verify_recover) { 308 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 309 return 0; 310 } 311 ctx->operation = EVP_PKEY_OP_VERIFYRECOVER; 312 return 1; 313 } 314 315 int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len, 316 const uint8_t *sig, size_t sig_len) { 317 if (!ctx || !ctx->pmeth || !ctx->pmeth->verify_recover) { 318 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 319 return 0; 320 } 321 if (ctx->operation != EVP_PKEY_OP_VERIFYRECOVER) { 322 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 323 return 0; 324 } 325 return ctx->pmeth->verify_recover(ctx, out, out_len, sig, sig_len); 326 } 327 328 int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx) { 329 if (!ctx || !ctx->pmeth || !ctx->pmeth->derive) { 330 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 331 return 0; 332 } 333 ctx->operation = EVP_PKEY_OP_DERIVE; 334 return 1; 335 } 336 337 int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY *peer) { 338 int ret; 339 if (!ctx || !ctx->pmeth || 340 !(ctx->pmeth->derive || ctx->pmeth->encrypt || ctx->pmeth->decrypt) || 341 !ctx->pmeth->ctrl) { 342 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 343 return 0; 344 } 345 if (ctx->operation != EVP_PKEY_OP_DERIVE && 346 ctx->operation != EVP_PKEY_OP_ENCRYPT && 347 ctx->operation != EVP_PKEY_OP_DECRYPT) { 348 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 349 return 0; 350 } 351 352 ret = ctx->pmeth->ctrl(ctx, EVP_PKEY_CTRL_PEER_KEY, 0, peer); 353 354 if (ret <= 0) { 355 return 0; 356 } 357 358 if (ret == 2) { 359 return 1; 360 } 361 362 if (!ctx->pkey) { 363 OPENSSL_PUT_ERROR(EVP, EVP_R_NO_KEY_SET); 364 return 0; 365 } 366 367 if (ctx->pkey->type != peer->type) { 368 OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_KEY_TYPES); 369 return 0; 370 } 371 372 /* ran (at) cryptocom.ru: For clarity. The error is if parameters in peer are 373 * present (!missing) but don't match. EVP_PKEY_cmp_parameters may return 374 * 1 (match), 0 (don't match) and -2 (comparison is not defined). -1 375 * (different key types) is impossible here because it is checked earlier. 376 * -2 is OK for us here, as well as 1, so we can check for 0 only. */ 377 if (!EVP_PKEY_missing_parameters(peer) && 378 !EVP_PKEY_cmp_parameters(ctx->pkey, peer)) { 379 OPENSSL_PUT_ERROR(EVP, EVP_R_DIFFERENT_PARAMETERS); 380 return 0; 381 } 382 383 EVP_PKEY_free(ctx->peerkey); 384 ctx->peerkey = peer; 385 386 ret = ctx->pmeth->ctrl(ctx, EVP_PKEY_CTRL_PEER_KEY, 1, peer); 387 388 if (ret <= 0) { 389 ctx->peerkey = NULL; 390 return 0; 391 } 392 393 EVP_PKEY_up_ref(peer); 394 return 1; 395 } 396 397 int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, uint8_t *key, size_t *out_key_len) { 398 if (!ctx || !ctx->pmeth || !ctx->pmeth->derive) { 399 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 400 return 0; 401 } 402 if (ctx->operation != EVP_PKEY_OP_DERIVE) { 403 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 404 return 0; 405 } 406 return ctx->pmeth->derive(ctx, key, out_key_len); 407 } 408 409 int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx) { 410 if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen) { 411 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 412 return 0; 413 } 414 ctx->operation = EVP_PKEY_OP_KEYGEN; 415 return 1; 416 } 417 418 int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey) { 419 if (!ctx || !ctx->pmeth || !ctx->pmeth->keygen) { 420 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE); 421 return 0; 422 } 423 if (ctx->operation != EVP_PKEY_OP_KEYGEN) { 424 OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED); 425 return 0; 426 } 427 428 if (!ppkey) { 429 return 0; 430 } 431 432 if (!*ppkey) { 433 *ppkey = EVP_PKEY_new(); 434 if (!*ppkey) { 435 OPENSSL_PUT_ERROR(EVP, ERR_LIB_EVP); 436 return 0; 437 } 438 } 439 440 if (!ctx->pmeth->keygen(ctx, *ppkey)) { 441 EVP_PKEY_free(*ppkey); 442 *ppkey = NULL; 443 return 0; 444 } 445 return 1; 446 } 447