Path: blob/main/crypto/openssl/providers/implementations/include/prov/ciphercommon_ccm.h
105221 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, size_t *padlen, const unsigned char *in, size_t len));51PROV_CIPHER_FUNC(int, CCM_setkey, (PROV_CCM_CTX * ctx, const unsigned char *key, size_t keylen));52PROV_CIPHER_FUNC(int, CCM_setiv, (PROV_CCM_CTX * dat, const unsigned char *iv, size_t ivlen, size_t mlen));53PROV_CIPHER_FUNC(int, CCM_setaad, (PROV_CCM_CTX * ctx, const unsigned char *aad, size_t aadlen));54PROV_CIPHER_FUNC(int, CCM_auth_encrypt, (PROV_CCM_CTX * ctx, const unsigned char *in, unsigned char *out, size_t len, unsigned char *tag, size_t taglen));55PROV_CIPHER_FUNC(int, CCM_auth_decrypt, (PROV_CCM_CTX * ctx, const unsigned char *in, unsigned char *out, size_t len, unsigned char *tag, size_t taglen));56PROV_CIPHER_FUNC(int, CCM_gettag, (PROV_CCM_CTX * ctx, unsigned char *tag, size_t taglen));5758/*59* CCM Mode internal method table used to handle hardware specific differences,60* (and different algorithms).61*/62struct prov_ccm_hw_st {63OSSL_CCM_setkey_fn setkey;64OSSL_CCM_setiv_fn setiv;65OSSL_CCM_setaad_fn setaad;66OSSL_CCM_auth_encrypt_fn auth_encrypt;67OSSL_CCM_auth_decrypt_fn auth_decrypt;68OSSL_CCM_gettag_fn gettag;69};7071OSSL_FUNC_cipher_encrypt_init_fn ossl_ccm_einit;72OSSL_FUNC_cipher_decrypt_init_fn ossl_ccm_dinit;73OSSL_FUNC_cipher_get_ctx_params_fn ossl_ccm_get_ctx_params;74OSSL_FUNC_cipher_set_ctx_params_fn ossl_ccm_set_ctx_params;75OSSL_FUNC_cipher_update_fn ossl_ccm_stream_update;76OSSL_FUNC_cipher_final_fn ossl_ccm_stream_final;77OSSL_FUNC_cipher_cipher_fn ossl_ccm_cipher;78void ossl_ccm_initctx(PROV_CCM_CTX *ctx, size_t keybits, const PROV_CCM_HW *hw);7980int ossl_ccm_generic_setiv(PROV_CCM_CTX *ctx, const unsigned char *nonce,81size_t nlen, size_t mlen);82int ossl_ccm_generic_setaad(PROV_CCM_CTX *ctx, const unsigned char *aad,83size_t alen);84int ossl_ccm_generic_gettag(PROV_CCM_CTX *ctx, unsigned char *tag, size_t tlen);85int ossl_ccm_generic_auth_encrypt(PROV_CCM_CTX *ctx, const unsigned char *in,86unsigned char *out, size_t len,87unsigned char *tag, size_t taglen);88int ossl_ccm_generic_auth_decrypt(PROV_CCM_CTX *ctx, const unsigned char *in,89unsigned char *out, size_t len,90unsigned char *expected_tag, size_t taglen);9192#endif939495