1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * EVP _meth_ APIs are deprecated for public use, but still ok for 12e1051a39Sopenharmony_ci * internal use. 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci#include "internal/deprecated.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include <string.h> 17e1051a39Sopenharmony_ci 18e1051a39Sopenharmony_ci#include <openssl/evp.h> 19e1051a39Sopenharmony_ci#include "crypto/evp.h" 20e1051a39Sopenharmony_ci#include "internal/provider.h" 21e1051a39Sopenharmony_ci#include "evp_local.h" 22e1051a39Sopenharmony_ci 23e1051a39Sopenharmony_ciEVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len) 24e1051a39Sopenharmony_ci{ 25e1051a39Sopenharmony_ci EVP_CIPHER *cipher = evp_cipher_new(); 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci if (cipher != NULL) { 28e1051a39Sopenharmony_ci cipher->nid = cipher_type; 29e1051a39Sopenharmony_ci cipher->block_size = block_size; 30e1051a39Sopenharmony_ci cipher->key_len = key_len; 31e1051a39Sopenharmony_ci cipher->origin = EVP_ORIG_METH; 32e1051a39Sopenharmony_ci } 33e1051a39Sopenharmony_ci return cipher; 34e1051a39Sopenharmony_ci} 35e1051a39Sopenharmony_ci 36e1051a39Sopenharmony_ciEVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher) 37e1051a39Sopenharmony_ci{ 38e1051a39Sopenharmony_ci EVP_CIPHER *to = NULL; 39e1051a39Sopenharmony_ci 40e1051a39Sopenharmony_ci /* 41e1051a39Sopenharmony_ci * Non-legacy EVP_CIPHERs can't be duplicated like this. 42e1051a39Sopenharmony_ci * Use EVP_CIPHER_up_ref() instead. 43e1051a39Sopenharmony_ci */ 44e1051a39Sopenharmony_ci if (cipher->prov != NULL) 45e1051a39Sopenharmony_ci return NULL; 46e1051a39Sopenharmony_ci 47e1051a39Sopenharmony_ci if ((to = EVP_CIPHER_meth_new(cipher->nid, cipher->block_size, 48e1051a39Sopenharmony_ci cipher->key_len)) != NULL) { 49e1051a39Sopenharmony_ci CRYPTO_RWLOCK *lock = to->lock; 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ci memcpy(to, cipher, sizeof(*to)); 52e1051a39Sopenharmony_ci to->lock = lock; 53e1051a39Sopenharmony_ci to->origin = EVP_ORIG_METH; 54e1051a39Sopenharmony_ci } 55e1051a39Sopenharmony_ci return to; 56e1051a39Sopenharmony_ci} 57e1051a39Sopenharmony_ci 58e1051a39Sopenharmony_civoid EVP_CIPHER_meth_free(EVP_CIPHER *cipher) 59e1051a39Sopenharmony_ci{ 60e1051a39Sopenharmony_ci if (cipher == NULL || cipher->origin != EVP_ORIG_METH) 61e1051a39Sopenharmony_ci return; 62e1051a39Sopenharmony_ci 63e1051a39Sopenharmony_ci evp_cipher_free_int(cipher); 64e1051a39Sopenharmony_ci} 65e1051a39Sopenharmony_ci 66e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len) 67e1051a39Sopenharmony_ci{ 68e1051a39Sopenharmony_ci if (cipher->iv_len != 0) 69e1051a39Sopenharmony_ci return 0; 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_ci cipher->iv_len = iv_len; 72e1051a39Sopenharmony_ci return 1; 73e1051a39Sopenharmony_ci} 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags) 76e1051a39Sopenharmony_ci{ 77e1051a39Sopenharmony_ci if (cipher->flags != 0) 78e1051a39Sopenharmony_ci return 0; 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ci cipher->flags = flags; 81e1051a39Sopenharmony_ci return 1; 82e1051a39Sopenharmony_ci} 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size) 85e1051a39Sopenharmony_ci{ 86e1051a39Sopenharmony_ci if (cipher->ctx_size != 0) 87e1051a39Sopenharmony_ci return 0; 88e1051a39Sopenharmony_ci 89e1051a39Sopenharmony_ci cipher->ctx_size = ctx_size; 90e1051a39Sopenharmony_ci return 1; 91e1051a39Sopenharmony_ci} 92e1051a39Sopenharmony_ci 93e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher, 94e1051a39Sopenharmony_ci int (*init) (EVP_CIPHER_CTX *ctx, 95e1051a39Sopenharmony_ci const unsigned char *key, 96e1051a39Sopenharmony_ci const unsigned char *iv, 97e1051a39Sopenharmony_ci int enc)) 98e1051a39Sopenharmony_ci{ 99e1051a39Sopenharmony_ci if (cipher->init != NULL) 100e1051a39Sopenharmony_ci return 0; 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ci cipher->init = init; 103e1051a39Sopenharmony_ci return 1; 104e1051a39Sopenharmony_ci} 105e1051a39Sopenharmony_ci 106e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher, 107e1051a39Sopenharmony_ci int (*do_cipher) (EVP_CIPHER_CTX *ctx, 108e1051a39Sopenharmony_ci unsigned char *out, 109e1051a39Sopenharmony_ci const unsigned char *in, 110e1051a39Sopenharmony_ci size_t inl)) 111e1051a39Sopenharmony_ci{ 112e1051a39Sopenharmony_ci if (cipher->do_cipher != NULL) 113e1051a39Sopenharmony_ci return 0; 114e1051a39Sopenharmony_ci 115e1051a39Sopenharmony_ci cipher->do_cipher = do_cipher; 116e1051a39Sopenharmony_ci return 1; 117e1051a39Sopenharmony_ci} 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher, 120e1051a39Sopenharmony_ci int (*cleanup) (EVP_CIPHER_CTX *)) 121e1051a39Sopenharmony_ci{ 122e1051a39Sopenharmony_ci if (cipher->cleanup != NULL) 123e1051a39Sopenharmony_ci return 0; 124e1051a39Sopenharmony_ci 125e1051a39Sopenharmony_ci cipher->cleanup = cleanup; 126e1051a39Sopenharmony_ci return 1; 127e1051a39Sopenharmony_ci} 128e1051a39Sopenharmony_ci 129e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher, 130e1051a39Sopenharmony_ci int (*set_asn1_parameters) (EVP_CIPHER_CTX *, 131e1051a39Sopenharmony_ci ASN1_TYPE *)) 132e1051a39Sopenharmony_ci{ 133e1051a39Sopenharmony_ci if (cipher->set_asn1_parameters != NULL) 134e1051a39Sopenharmony_ci return 0; 135e1051a39Sopenharmony_ci 136e1051a39Sopenharmony_ci cipher->set_asn1_parameters = set_asn1_parameters; 137e1051a39Sopenharmony_ci return 1; 138e1051a39Sopenharmony_ci} 139e1051a39Sopenharmony_ci 140e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher, 141e1051a39Sopenharmony_ci int (*get_asn1_parameters) (EVP_CIPHER_CTX *, 142e1051a39Sopenharmony_ci ASN1_TYPE *)) 143e1051a39Sopenharmony_ci{ 144e1051a39Sopenharmony_ci if (cipher->get_asn1_parameters != NULL) 145e1051a39Sopenharmony_ci return 0; 146e1051a39Sopenharmony_ci 147e1051a39Sopenharmony_ci cipher->get_asn1_parameters = get_asn1_parameters; 148e1051a39Sopenharmony_ci return 1; 149e1051a39Sopenharmony_ci} 150e1051a39Sopenharmony_ci 151e1051a39Sopenharmony_ciint EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher, 152e1051a39Sopenharmony_ci int (*ctrl) (EVP_CIPHER_CTX *, int type, 153e1051a39Sopenharmony_ci int arg, void *ptr)) 154e1051a39Sopenharmony_ci{ 155e1051a39Sopenharmony_ci if (cipher->ctrl != NULL) 156e1051a39Sopenharmony_ci return 0; 157e1051a39Sopenharmony_ci 158e1051a39Sopenharmony_ci cipher->ctrl = ctrl; 159e1051a39Sopenharmony_ci return 1; 160e1051a39Sopenharmony_ci} 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ci 163e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, 164e1051a39Sopenharmony_ci const unsigned char *key, 165e1051a39Sopenharmony_ci const unsigned char *iv, 166e1051a39Sopenharmony_ci int enc) 167e1051a39Sopenharmony_ci{ 168e1051a39Sopenharmony_ci return cipher->init; 169e1051a39Sopenharmony_ci} 170e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx, 171e1051a39Sopenharmony_ci unsigned char *out, 172e1051a39Sopenharmony_ci const unsigned char *in, 173e1051a39Sopenharmony_ci size_t inl) 174e1051a39Sopenharmony_ci{ 175e1051a39Sopenharmony_ci return cipher->do_cipher; 176e1051a39Sopenharmony_ci} 177e1051a39Sopenharmony_ci 178e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *) 179e1051a39Sopenharmony_ci{ 180e1051a39Sopenharmony_ci return cipher->cleanup; 181e1051a39Sopenharmony_ci} 182e1051a39Sopenharmony_ci 183e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, 184e1051a39Sopenharmony_ci ASN1_TYPE *) 185e1051a39Sopenharmony_ci{ 186e1051a39Sopenharmony_ci return cipher->set_asn1_parameters; 187e1051a39Sopenharmony_ci} 188e1051a39Sopenharmony_ci 189e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, 190e1051a39Sopenharmony_ci ASN1_TYPE *) 191e1051a39Sopenharmony_ci{ 192e1051a39Sopenharmony_ci return cipher->get_asn1_parameters; 193e1051a39Sopenharmony_ci} 194e1051a39Sopenharmony_ci 195e1051a39Sopenharmony_ciint (*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *, 196e1051a39Sopenharmony_ci int type, int arg, 197e1051a39Sopenharmony_ci void *ptr) 198e1051a39Sopenharmony_ci{ 199e1051a39Sopenharmony_ci return cipher->ctrl; 200e1051a39Sopenharmony_ci} 201e1051a39Sopenharmony_ci 202