1*62c56f98SSadaf Ebrahimi /** 2*62c56f98SSadaf Ebrahimi * \file cipher_wrap.h 3*62c56f98SSadaf Ebrahimi * 4*62c56f98SSadaf Ebrahimi * \brief Cipher wrappers. 5*62c56f98SSadaf Ebrahimi * 6*62c56f98SSadaf Ebrahimi * \author Adriaan de Jong <[email protected]> 7*62c56f98SSadaf Ebrahimi */ 8*62c56f98SSadaf Ebrahimi /* 9*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors 10*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 11*62c56f98SSadaf Ebrahimi */ 12*62c56f98SSadaf Ebrahimi #ifndef MBEDTLS_CIPHER_WRAP_H 13*62c56f98SSadaf Ebrahimi #define MBEDTLS_CIPHER_WRAP_H 14*62c56f98SSadaf Ebrahimi 15*62c56f98SSadaf Ebrahimi #include "mbedtls/build_info.h" 16*62c56f98SSadaf Ebrahimi 17*62c56f98SSadaf Ebrahimi #include "mbedtls/cipher.h" 18*62c56f98SSadaf Ebrahimi 19*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) 20*62c56f98SSadaf Ebrahimi #include "psa/crypto.h" 21*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */ 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimi #ifdef __cplusplus 24*62c56f98SSadaf Ebrahimi extern "C" { 25*62c56f98SSadaf Ebrahimi #endif 26*62c56f98SSadaf Ebrahimi 27*62c56f98SSadaf Ebrahimi /** 28*62c56f98SSadaf Ebrahimi * Base cipher information. The non-mode specific functions and values. 29*62c56f98SSadaf Ebrahimi */ 30*62c56f98SSadaf Ebrahimi struct mbedtls_cipher_base_t { 31*62c56f98SSadaf Ebrahimi /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ 32*62c56f98SSadaf Ebrahimi mbedtls_cipher_id_t cipher; 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimi /** Encrypt using ECB */ 35*62c56f98SSadaf Ebrahimi int (*ecb_func)(void *ctx, mbedtls_operation_t mode, 36*62c56f98SSadaf Ebrahimi const unsigned char *input, unsigned char *output); 37*62c56f98SSadaf Ebrahimi 38*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CBC) 39*62c56f98SSadaf Ebrahimi /** Encrypt using CBC */ 40*62c56f98SSadaf Ebrahimi int (*cbc_func)(void *ctx, mbedtls_operation_t mode, size_t length, 41*62c56f98SSadaf Ebrahimi unsigned char *iv, const unsigned char *input, 42*62c56f98SSadaf Ebrahimi unsigned char *output); 43*62c56f98SSadaf Ebrahimi #endif 44*62c56f98SSadaf Ebrahimi 45*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CFB) 46*62c56f98SSadaf Ebrahimi /** Encrypt using CFB (Full length) */ 47*62c56f98SSadaf Ebrahimi int (*cfb_func)(void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, 48*62c56f98SSadaf Ebrahimi unsigned char *iv, const unsigned char *input, 49*62c56f98SSadaf Ebrahimi unsigned char *output); 50*62c56f98SSadaf Ebrahimi #endif 51*62c56f98SSadaf Ebrahimi 52*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_OFB) 53*62c56f98SSadaf Ebrahimi /** Encrypt using OFB (Full length) */ 54*62c56f98SSadaf Ebrahimi int (*ofb_func)(void *ctx, size_t length, size_t *iv_off, 55*62c56f98SSadaf Ebrahimi unsigned char *iv, 56*62c56f98SSadaf Ebrahimi const unsigned char *input, 57*62c56f98SSadaf Ebrahimi unsigned char *output); 58*62c56f98SSadaf Ebrahimi #endif 59*62c56f98SSadaf Ebrahimi 60*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CTR) 61*62c56f98SSadaf Ebrahimi /** Encrypt using CTR */ 62*62c56f98SSadaf Ebrahimi int (*ctr_func)(void *ctx, size_t length, size_t *nc_off, 63*62c56f98SSadaf Ebrahimi unsigned char *nonce_counter, unsigned char *stream_block, 64*62c56f98SSadaf Ebrahimi const unsigned char *input, unsigned char *output); 65*62c56f98SSadaf Ebrahimi #endif 66*62c56f98SSadaf Ebrahimi 67*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_XTS) 68*62c56f98SSadaf Ebrahimi /** Encrypt or decrypt using XTS. */ 69*62c56f98SSadaf Ebrahimi int (*xts_func)(void *ctx, mbedtls_operation_t mode, size_t length, 70*62c56f98SSadaf Ebrahimi const unsigned char data_unit[16], 71*62c56f98SSadaf Ebrahimi const unsigned char *input, unsigned char *output); 72*62c56f98SSadaf Ebrahimi #endif 73*62c56f98SSadaf Ebrahimi 74*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_STREAM) 75*62c56f98SSadaf Ebrahimi /** Encrypt using STREAM */ 76*62c56f98SSadaf Ebrahimi int (*stream_func)(void *ctx, size_t length, 77*62c56f98SSadaf Ebrahimi const unsigned char *input, unsigned char *output); 78*62c56f98SSadaf Ebrahimi #endif 79*62c56f98SSadaf Ebrahimi 80*62c56f98SSadaf Ebrahimi /** Set key for encryption purposes */ 81*62c56f98SSadaf Ebrahimi int (*setkey_enc_func)(void *ctx, const unsigned char *key, 82*62c56f98SSadaf Ebrahimi unsigned int key_bitlen); 83*62c56f98SSadaf Ebrahimi 84*62c56f98SSadaf Ebrahimi /** Set key for decryption purposes */ 85*62c56f98SSadaf Ebrahimi int (*setkey_dec_func)(void *ctx, const unsigned char *key, 86*62c56f98SSadaf Ebrahimi unsigned int key_bitlen); 87*62c56f98SSadaf Ebrahimi 88*62c56f98SSadaf Ebrahimi /** Allocate a new context */ 89*62c56f98SSadaf Ebrahimi void * (*ctx_alloc_func)(void); 90*62c56f98SSadaf Ebrahimi 91*62c56f98SSadaf Ebrahimi /** Free the given context */ 92*62c56f98SSadaf Ebrahimi void (*ctx_free_func)(void *ctx); 93*62c56f98SSadaf Ebrahimi 94*62c56f98SSadaf Ebrahimi }; 95*62c56f98SSadaf Ebrahimi 96*62c56f98SSadaf Ebrahimi typedef struct { 97*62c56f98SSadaf Ebrahimi mbedtls_cipher_type_t type; 98*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *info; 99*62c56f98SSadaf Ebrahimi } mbedtls_cipher_definition_t; 100*62c56f98SSadaf Ebrahimi 101*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) 102*62c56f98SSadaf Ebrahimi typedef enum { 103*62c56f98SSadaf Ebrahimi MBEDTLS_CIPHER_PSA_KEY_UNSET = 0, 104*62c56f98SSadaf Ebrahimi MBEDTLS_CIPHER_PSA_KEY_OWNED, /* Used for PSA-based cipher contexts which */ 105*62c56f98SSadaf Ebrahimi /* use raw key material internally imported */ 106*62c56f98SSadaf Ebrahimi /* as a volatile key, and which hence need */ 107*62c56f98SSadaf Ebrahimi /* to destroy that key when the context is */ 108*62c56f98SSadaf Ebrahimi /* freed. */ 109*62c56f98SSadaf Ebrahimi MBEDTLS_CIPHER_PSA_KEY_NOT_OWNED, /* Used for PSA-based cipher contexts */ 110*62c56f98SSadaf Ebrahimi /* which use a key provided by the */ 111*62c56f98SSadaf Ebrahimi /* user, and which hence will not be */ 112*62c56f98SSadaf Ebrahimi /* destroyed when the context is freed. */ 113*62c56f98SSadaf Ebrahimi } mbedtls_cipher_psa_key_ownership; 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimi typedef struct { 116*62c56f98SSadaf Ebrahimi psa_algorithm_t alg; 117*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t slot; 118*62c56f98SSadaf Ebrahimi mbedtls_cipher_psa_key_ownership slot_state; 119*62c56f98SSadaf Ebrahimi } mbedtls_cipher_context_psa; 120*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */ 121*62c56f98SSadaf Ebrahimi 122*62c56f98SSadaf Ebrahimi extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; 123*62c56f98SSadaf Ebrahimi 124*62c56f98SSadaf Ebrahimi extern int mbedtls_cipher_supported[]; 125*62c56f98SSadaf Ebrahimi 126*62c56f98SSadaf Ebrahimi extern const mbedtls_cipher_base_t *mbedtls_cipher_base_lookup_table[]; 127*62c56f98SSadaf Ebrahimi 128*62c56f98SSadaf Ebrahimi #ifdef __cplusplus 129*62c56f98SSadaf Ebrahimi } 130*62c56f98SSadaf Ebrahimi #endif 131*62c56f98SSadaf Ebrahimi 132*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_CIPHER_WRAP_H */ 133