1*b077aed3SPierre Pronchery /* 2*b077aed3SPierre Pronchery * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. 3*b077aed3SPierre Pronchery * 4*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 5*b077aed3SPierre Pronchery * this file except in compliance with the License. You can obtain a copy 6*b077aed3SPierre Pronchery * in the file LICENSE in the source distribution or at 7*b077aed3SPierre Pronchery * https://www.openssl.org/source/license.html 8*b077aed3SPierre Pronchery */ 9*b077aed3SPierre Pronchery 10*b077aed3SPierre Pronchery #include <openssl/des.h> 11*b077aed3SPierre Pronchery #include <openssl/core_dispatch.h> 12*b077aed3SPierre Pronchery #include "crypto/des_platform.h" 13*b077aed3SPierre Pronchery 14*b077aed3SPierre Pronchery #define DES_BLOCK_SIZE 8 15*b077aed3SPierre Pronchery #define TDES_IVLEN 8 16*b077aed3SPierre Pronchery #define TDES_FLAGS PROV_CIPHER_FLAG_RAND_KEY 17*b077aed3SPierre Pronchery 18*b077aed3SPierre Pronchery typedef struct prov_tdes_ctx_st { 19*b077aed3SPierre Pronchery PROV_CIPHER_CTX base; /* Must be first */ 20*b077aed3SPierre Pronchery union { 21*b077aed3SPierre Pronchery OSSL_UNION_ALIGN; 22*b077aed3SPierre Pronchery DES_key_schedule ks[3]; 23*b077aed3SPierre Pronchery } tks; 24*b077aed3SPierre Pronchery union { 25*b077aed3SPierre Pronchery void (*cbc) (const void *, void *, size_t, 26*b077aed3SPierre Pronchery const DES_key_schedule *, unsigned char *); 27*b077aed3SPierre Pronchery } tstream; 28*b077aed3SPierre Pronchery 29*b077aed3SPierre Pronchery } PROV_TDES_CTX; 30*b077aed3SPierre Pronchery 31*b077aed3SPierre Pronchery #define IMPLEMENT_tdes_cipher(type, UCTYPE, lcmode, UCMODE, flags, \ 32*b077aed3SPierre Pronchery kbits, blkbits, ivbits, block) \ 33*b077aed3SPierre Pronchery static OSSL_FUNC_cipher_newctx_fn tdes_##type##_##lcmode##_newctx; \ 34*b077aed3SPierre Pronchery static void *tdes_##type##_##lcmode##_newctx(void *provctx) \ 35*b077aed3SPierre Pronchery { \ 36*b077aed3SPierre Pronchery return ossl_tdes_newctx(provctx, EVP_CIPH_##UCMODE##_MODE, kbits, blkbits, \ 37*b077aed3SPierre Pronchery ivbits, flags, \ 38*b077aed3SPierre Pronchery ossl_prov_cipher_hw_tdes_##type##_##lcmode()); \ 39*b077aed3SPierre Pronchery } \ 40*b077aed3SPierre Pronchery static OSSL_FUNC_cipher_get_params_fn tdes_##type##_##lcmode##_get_params; \ 41*b077aed3SPierre Pronchery static int tdes_##type##_##lcmode##_get_params(OSSL_PARAM params[]) \ 42*b077aed3SPierre Pronchery { \ 43*b077aed3SPierre Pronchery return ossl_cipher_generic_get_params(params, EVP_CIPH_##UCMODE##_MODE, \ 44*b077aed3SPierre Pronchery flags, kbits, blkbits, ivbits); \ 45*b077aed3SPierre Pronchery } \ 46*b077aed3SPierre Pronchery const OSSL_DISPATCH ossl_tdes_##type##_##lcmode##_functions[] = { \ 47*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))ossl_tdes_einit }, \ 48*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))ossl_tdes_dinit }, \ 49*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_UPDATE, \ 50*b077aed3SPierre Pronchery (void (*)(void))ossl_cipher_generic_##block##_update }, \ 51*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_FINAL, \ 52*b077aed3SPierre Pronchery (void (*)(void))ossl_cipher_generic_##block##_final }, \ 53*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))ossl_cipher_generic_cipher }, \ 54*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_NEWCTX, \ 55*b077aed3SPierre Pronchery (void (*)(void))tdes_##type##_##lcmode##_newctx }, \ 56*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void))ossl_tdes_dupctx }, \ 57*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))ossl_tdes_freectx }, \ 58*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_GET_PARAMS, \ 59*b077aed3SPierre Pronchery (void (*)(void))tdes_##type##_##lcmode##_get_params }, \ 60*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_GETTABLE_PARAMS, \ 61*b077aed3SPierre Pronchery (void (*)(void))ossl_cipher_generic_gettable_params }, \ 62*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_GET_CTX_PARAMS, \ 63*b077aed3SPierre Pronchery (void (*)(void))ossl_tdes_get_ctx_params }, \ 64*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS, \ 65*b077aed3SPierre Pronchery (void (*)(void))ossl_tdes_gettable_ctx_params }, \ 66*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_SET_CTX_PARAMS, \ 67*b077aed3SPierre Pronchery (void (*)(void))ossl_cipher_generic_set_ctx_params }, \ 68*b077aed3SPierre Pronchery { OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS, \ 69*b077aed3SPierre Pronchery (void (*)(void))ossl_cipher_generic_settable_ctx_params }, \ 70*b077aed3SPierre Pronchery { 0, NULL } \ 71*b077aed3SPierre Pronchery } 72*b077aed3SPierre Pronchery 73*b077aed3SPierre Pronchery void *ossl_tdes_newctx(void *provctx, int mode, size_t kbits, size_t blkbits, 74*b077aed3SPierre Pronchery size_t ivbits, uint64_t flags, const PROV_CIPHER_HW *hw); 75*b077aed3SPierre Pronchery OSSL_FUNC_cipher_dupctx_fn ossl_tdes_dupctx; 76*b077aed3SPierre Pronchery OSSL_FUNC_cipher_freectx_fn ossl_tdes_freectx; 77*b077aed3SPierre Pronchery OSSL_FUNC_cipher_encrypt_init_fn ossl_tdes_einit; 78*b077aed3SPierre Pronchery OSSL_FUNC_cipher_decrypt_init_fn ossl_tdes_dinit; 79*b077aed3SPierre Pronchery OSSL_FUNC_cipher_get_ctx_params_fn ossl_tdes_get_ctx_params; 80*b077aed3SPierre Pronchery OSSL_FUNC_cipher_gettable_ctx_params_fn ossl_tdes_gettable_ctx_params; 81*b077aed3SPierre Pronchery 82*b077aed3SPierre Pronchery #define PROV_CIPHER_HW_tdes_mode(type, mode) \ 83*b077aed3SPierre Pronchery static const PROV_CIPHER_HW type##_##mode = { \ 84*b077aed3SPierre Pronchery ossl_cipher_hw_tdes_##type##_initkey, \ 85*b077aed3SPierre Pronchery ossl_cipher_hw_tdes_##mode, \ 86*b077aed3SPierre Pronchery ossl_cipher_hw_tdes_copyctx \ 87*b077aed3SPierre Pronchery }; \ 88*b077aed3SPierre Pronchery const PROV_CIPHER_HW *ossl_prov_cipher_hw_tdes_##type##_##mode(void) \ 89*b077aed3SPierre Pronchery { \ 90*b077aed3SPierre Pronchery return &type##_##mode; \ 91*b077aed3SPierre Pronchery } 92*b077aed3SPierre Pronchery 93*b077aed3SPierre Pronchery int ossl_cipher_hw_tdes_ede3_initkey(PROV_CIPHER_CTX *ctx, 94*b077aed3SPierre Pronchery const unsigned char *key, size_t keylen); 95*b077aed3SPierre Pronchery void ossl_cipher_hw_tdes_copyctx(PROV_CIPHER_CTX *dst, 96*b077aed3SPierre Pronchery const PROV_CIPHER_CTX *src); 97*b077aed3SPierre Pronchery int ossl_cipher_hw_tdes_cbc(PROV_CIPHER_CTX *ctx, unsigned char *out, 98*b077aed3SPierre Pronchery const unsigned char *in, size_t inl); 99*b077aed3SPierre Pronchery int ossl_cipher_hw_tdes_ecb(PROV_CIPHER_CTX *ctx, unsigned char *out, 100*b077aed3SPierre Pronchery const unsigned char *in, size_t len); 101*b077aed3SPierre Pronchery 102*b077aed3SPierre Pronchery const PROV_CIPHER_HW *ossl_prov_cipher_hw_tdes_ede3_cbc(void); 103*b077aed3SPierre Pronchery const PROV_CIPHER_HW *ossl_prov_cipher_hw_tdes_ede3_ecb(void); 104