mirror of
https://github.com/CovidBraceletPrj/CovidBracelet.git
synced 2025-01-09 20:54:26 +01:00
182 lines
6.8 KiB
C
182 lines
6.8 KiB
C
/*
|
||
* Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
|
||
*
|
||
* SPDX-License-Identifier: BSD-3-Clause
|
||
*/
|
||
|
||
/*!
|
||
@addtogroup cc_ecies
|
||
@{
|
||
*/
|
||
|
||
/*!
|
||
@file mbedtls_cc_ecies.h
|
||
|
||
@brief This file contains the CryptoCell Elliptic Curve Integrated Encryption Scheme (ECIES) APIs.
|
||
*/
|
||
|
||
#ifndef _MBEDTLS_CC_ECIES_H
|
||
#define _MBEDTLS_CC_ECIES_H
|
||
|
||
|
||
#include "cc_ecpki_types.h"
|
||
#include "cc_pal_types_plat.h"
|
||
#include "cc_kdf.h"
|
||
#include "mbedtls_cc_hkdf.h"
|
||
#include "mbedtls/ecp.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
/*! The maximal length of the ECIES cipher in bytes. */
|
||
#define MBEDTLS_ECIES_MAX_CIPHER_LEN_BYTES ((2*CC_ECPKI_MODUL_MAX_LENGTH_IN_WORDS + 1) * sizeof(int))
|
||
/*! The minimal length of the ECIES buffer in bytes. */
|
||
#define MBEDTLS_ECIES_MIN_BUFF_LEN_BYTES (sizeof(CCEciesTempData_t))
|
||
|
||
/*!
|
||
@brief A macro for creating and encrypting a secret key.
|
||
|
||
For a description of the parameters see ::mbedtls_ecies_kem_encrypt_full.
|
||
*/
|
||
#define mbedtls_ecies_kem_encrypt(pGrp, pRecipPublKey, kdfDerivMode, kdfHashMode, \
|
||
isSingleHashMode, pSecrKey, secrKeySize, \
|
||
pCipherData, pCipherDataSize, pBuff, buffLen, \
|
||
f_rng, p_rng) \
|
||
mbedtls_ecies_kem_encrypt_full((pGrp), (pRecipPublKey), (kdfDerivMode), (kdfHashMode), \
|
||
(isSingleHashMode), NULL, NULL, (pSecrKey), (secrKeySize), \
|
||
(pCipherData), (pCipherDataSize), (pBuff), (buffLen), \
|
||
f_rng, p_rng)
|
||
|
||
/*!
|
||
@brief This function creates and encrypts (encapsulates) the secret key of
|
||
required size, according to <em>ISO/IEC 18033-2:2006: Information technology
|
||
-- Security techniques -- Encryption algorithms -- Part 2: Asymmetric
|
||
ciphers</em>, ECIES-KEM Encryption.
|
||
|
||
To call this function in applications, the ::mbedtls_ecies_kem_encrypt macro
|
||
definition must be used. The function itself has the additional input of the
|
||
external ephemeral key pair, used only for testing purposes.
|
||
|
||
@note Use KDF2 function mode for compliance with <em>X9.63-2011: Public Key
|
||
Cryptography for the Financial Services Industry – Key Agreement and Key
|
||
Transport Using Elliptic Curve Cryptography</em>. \par
|
||
|
||
@note The term "sender" indicates an entity that creates and
|
||
encapsulates the secret key using this function. The term "recipient"
|
||
indicates another entity which receives and decrypts the secret key. \par
|
||
|
||
@note All public and private keys that are used must relate to the same EC
|
||
Domain. \par
|
||
|
||
@note The user must verify that the public key of the recipient is
|
||
on the elliptic curve before it is used in this function.
|
||
|
||
@return CCError_t \c 0 on success.
|
||
*/
|
||
CCError_t mbedtls_ecies_kem_encrypt_full(
|
||
/*! [in] The ECP group to use. */
|
||
mbedtls_ecp_group *pGrp,
|
||
/*! [in] A pointer to the public key of the recipient. */
|
||
mbedtls_ecp_point *pRecipUzPublKey,
|
||
/*! [in] The KDF function mode to use: KDF1 or KDF2. For more
|
||
information, see CCKdfDerivFuncMode_t() in cc_kdf.h. */
|
||
CCKdfDerivFuncMode_t kdfDerivMode,
|
||
/*! [in] The used hash function. */
|
||
mbedtls_hkdf_hashmode_t kdfHashMode,
|
||
/*! [in] The specific ECIES mode, according to <em>ISO/IEC 18033-2:2006:
|
||
Information technology -- Security techniques -- Encryption algorithms
|
||
-- Part 2: Asymmetric ciphers</em> - section 10.2: 0: Not-single hash,
|
||
or 1: Single hash. */
|
||
uint32_t isSingleHashMode,
|
||
/*! [in] A pointer to the ephemeral public key related to the private
|
||
key. Must be set to NULL if \p pExtEphUzPrivateKey = NULL. */
|
||
mbedtls_ecp_point *pExtEphUzPublicKey,
|
||
/*! [in] The pointer to the external ephemeral private key. This key
|
||
is used only for testing the function. In regular use, the pointer
|
||
should be set to NULL and then the random key-pair should be generated
|
||
internally. */
|
||
mbedtls_mpi *pExtEphUzPrivateKey,
|
||
/*! [in] A pointer to the buffer for the secret-key data to be
|
||
generated. */
|
||
uint8_t *pSecrKey,
|
||
/*! [in] The size of the secret-key data in bytes. */
|
||
size_t secrKeySize,
|
||
/*! [in] A pointer to the encrypted cipher text. */
|
||
uint8_t *pCipherData,
|
||
/*! [in/out] In: A pointer to the size of the buffer for CipherData
|
||
output, or Out: The size of the buffer for CipherData output in
|
||
bytes. */
|
||
size_t *pCipherDataSize,
|
||
/*! [in] A pointer to the temporary buffer. */
|
||
void *pBuff,
|
||
/*! [in] The size of the buffer pointed by \p pBuff. Must not be less
|
||
than #MBEDTLS_ECIES_MIN_BUFF_LEN_BYTES. */
|
||
size_t buffLen,
|
||
/*! [in] The RNG function required for generating a key pair when
|
||
\p pExtEphUzPublicKey and \p pExtEphUzPrivateKey are NULL */
|
||
int (*f_rng)(void *, unsigned char *, size_t),
|
||
/*! [in] The RNG parameter. */
|
||
void *p_rng
|
||
);
|
||
|
||
/*!
|
||
@brief This function decrypts the encapsulated secret key passed by the
|
||
sender, according to <em>ISO/IEC 18033-2:2006: Information technology --
|
||
Security techniques -- Encryption algorithms -- Part 2: Asymmetric
|
||
ciphers</em>, sec. 10.2.4 - ECIES-KEM Decryption.
|
||
|
||
@note The KDF2 function mode must be used for compliance with <em>X9.63-2011:
|
||
Public Key Cryptography for the Financial Services Industry – Key Agreement
|
||
and Key Transport Using Elliptic Curve Cryptograph</em>. \par
|
||
|
||
@note The term "sender" indicates an entity that creates and
|
||
encapsulates the secret key using this function. The term "recipient"
|
||
indicates another entity which receives and decrypts the secret key. \par
|
||
|
||
@note All public and private keys that are used must relate to the same EC
|
||
Domain. \par
|
||
|
||
@return CCError_t \c 0 on success.
|
||
*/
|
||
CCError_t mbedtls_ecies_kem_decrypt(
|
||
/*! [in] The ECP group to use. */
|
||
mbedtls_ecp_group *pGrp,
|
||
/*! [in] A pointer to the private key of the recipient. */
|
||
mbedtls_mpi *pRecipUzPrivKey,
|
||
/*! [in] The KDF function mode to use: KDF1 or KDF2. For more
|
||
information, see CCKdfDerivFuncMode_t() in cc_kdf.h. */
|
||
CCKdfDerivFuncMode_t kdfDerivMode,
|
||
/*! [in] The used hash function. */
|
||
mbedtls_hkdf_hashmode_t kdfHashMode,
|
||
/*! [in] The specific ECIES mode definition: 0,1, according to
|
||
<em>ISO/IEC 18033-2:2006: Information technology -- Security techniques
|
||
-- Encryption algorithms -- Part 2: Asymmetric ciphers</em> -
|
||
section 10.2. */
|
||
uint32_t isSingleHashMode,
|
||
/*! [in] A pointer to the received encrypted cipher data. */
|
||
uint8_t *pCipherData,
|
||
/*! [in] The size of the cipher data in bytes. */
|
||
size_t cipherDataSize,
|
||
/*! [in] A pointer to the buffer for the secret-key data to be
|
||
generated. */
|
||
uint8_t *pSecrKey,
|
||
/*! [in] The size of the secret-key data in bytes. */
|
||
size_t secrKeySize,
|
||
/*! [in] A pointer to the temporary buffer. */
|
||
void *pBuff,
|
||
/*! [in] The size of the buffer pointed by \p pBuff. Must not be
|
||
less than #MBEDTLS_ECIES_MIN_BUFF_LEN_BYTES. */
|
||
size_t buffLen
|
||
);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/*!
|
||
@}
|
||
*/
|
||
#endif
|