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