Path: blob/main/crypto/openssl/providers/implementations/include/prov/ciphercommon_ccm.h
48534 views
/*1* Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89#ifndef OSSL_PROV_CIPHERCOMMON_CCM_H10# define OSSL_PROV_CIPHERCOMMON_CCM_H11# pragma once1213# include "ciphercommon_aead.h"1415typedef struct prov_ccm_hw_st PROV_CCM_HW;1617# if defined(OPENSSL_CPUID_OBJ) && defined(__s390__)18/*-19* KMAC-AES parameter block - begin20* (see z/Architecture Principles of Operation >= SA22-7832-08)21*/22typedef struct S390X_kmac_params_st {23union {24unsigned long long g[2];25unsigned char b[16];26} icv;27unsigned char k[32];28} S390X_KMAC_PARAMS;29/* KMAC-AES parameter block - end */30# endif3132/* Base structure that is shared by AES & ARIA for CCM MODE */33typedef struct prov_ccm_st {34unsigned int enc : 1;35unsigned int key_set : 1; /* Set if key initialised */36unsigned int iv_set : 1; /* Set if an iv is set */37unsigned int tag_set : 1; /* Set if tag is valid */38unsigned int len_set : 1; /* Set if message length set */39size_t l, m; /* L and M parameters from RFC3610 */40size_t keylen;41size_t tls_aad_len; /* TLS AAD length */42size_t tls_aad_pad_sz;43unsigned char iv[GENERIC_BLOCK_SIZE];44unsigned char buf[GENERIC_BLOCK_SIZE];45CCM128_CONTEXT ccm_ctx;46ccm128_f str;47const PROV_CCM_HW *hw; /* hardware specific methods */48} PROV_CCM_CTX;4950PROV_CIPHER_FUNC(int, CCM_cipher, (PROV_CCM_CTX *ctx, unsigned char *out, \51size_t *padlen, const unsigned char *in, \52size_t len));53PROV_CIPHER_FUNC(int, CCM_setkey, (PROV_CCM_CTX *ctx, \54const unsigned char *key, size_t keylen));55PROV_CIPHER_FUNC(int, CCM_setiv, (PROV_CCM_CTX *dat, \56const unsigned char *iv, size_t ivlen, \57size_t mlen));58PROV_CIPHER_FUNC(int, CCM_setaad, (PROV_CCM_CTX *ctx, \59const unsigned char *aad, size_t aadlen));60PROV_CIPHER_FUNC(int, CCM_auth_encrypt, (PROV_CCM_CTX *ctx, \61const unsigned char *in, \62unsigned char *out, size_t len, \63unsigned char *tag, size_t taglen));64PROV_CIPHER_FUNC(int, CCM_auth_decrypt, (PROV_CCM_CTX *ctx, \65const unsigned char *in, \66unsigned char *out, size_t len, \67unsigned char *tag, size_t taglen));68PROV_CIPHER_FUNC(int, CCM_gettag, (PROV_CCM_CTX *ctx, \69unsigned char *tag, size_t taglen));7071/*72* CCM Mode internal method table used to handle hardware specific differences,73* (and different algorithms).74*/75struct prov_ccm_hw_st {76OSSL_CCM_setkey_fn setkey;77OSSL_CCM_setiv_fn setiv;78OSSL_CCM_setaad_fn setaad;79OSSL_CCM_auth_encrypt_fn auth_encrypt;80OSSL_CCM_auth_decrypt_fn auth_decrypt;81OSSL_CCM_gettag_fn gettag;82};8384OSSL_FUNC_cipher_encrypt_init_fn ossl_ccm_einit;85OSSL_FUNC_cipher_decrypt_init_fn ossl_ccm_dinit;86OSSL_FUNC_cipher_get_ctx_params_fn ossl_ccm_get_ctx_params;87OSSL_FUNC_cipher_set_ctx_params_fn ossl_ccm_set_ctx_params;88OSSL_FUNC_cipher_update_fn ossl_ccm_stream_update;89OSSL_FUNC_cipher_final_fn ossl_ccm_stream_final;90OSSL_FUNC_cipher_cipher_fn ossl_ccm_cipher;91void ossl_ccm_initctx(PROV_CCM_CTX *ctx, size_t keybits, const PROV_CCM_HW *hw);9293int ossl_ccm_generic_setiv(PROV_CCM_CTX *ctx, const unsigned char *nonce,94size_t nlen, size_t mlen);95int ossl_ccm_generic_setaad(PROV_CCM_CTX *ctx, const unsigned char *aad,96size_t alen);97int ossl_ccm_generic_gettag(PROV_CCM_CTX *ctx, unsigned char *tag, size_t tlen);98int ossl_ccm_generic_auth_encrypt(PROV_CCM_CTX *ctx, const unsigned char *in,99unsigned char *out, size_t len,100unsigned char *tag, size_t taglen);101int ossl_ccm_generic_auth_decrypt(PROV_CCM_CTX *ctx, const unsigned char *in,102unsigned char *out, size_t len,103unsigned char *expected_tag, size_t taglen);104105#endif106107108