123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- /**************************************************************************************
- * Copyright (c) 2016-2017, ARM Limited or its affiliates. All rights reserved *
- * *
- * This file and the related binary are licensed under the following license: *
- * *
- * ARM Object Code and Header Files License, v1.0 Redistribution. *
- * *
- * Redistribution and use of object code, header files, and documentation, without *
- * modification, are permitted provided that the following conditions are met: *
- * *
- * 1) Redistributions must reproduce the above copyright notice and the *
- * following disclaimer in the documentation and/or other materials *
- * provided with the distribution. *
- * *
- * 2) Unless to the extent explicitly permitted by law, no reverse *
- * engineering, decompilation, or disassembly of is permitted. *
- * *
- * 3) Redistribution and use is permitted solely for the purpose of *
- * developing or executing applications that are targeted for use *
- * on an ARM-based product. *
- * *
- * DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
- * CONTRIBUTORS "AS IS." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT *
- * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, *
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *
- * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED *
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
- **************************************************************************************/
- #ifndef _CRYS_DH_KG_H
- #define _CRYS_DH_KG_H
- #include "crys_dh.h"
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*! @file
- @brief This module defines the API that supports Diffie-Hellman domain.
- @defgroup crys_dh_kg CryptoCell DH Key Generation APIs
- @{
- @ingroup crys_dh
- */
- /************************ Defines ******************************/
- /*! Minimal size of DH seed in bytes. */
- #define CRYS_DH_SEED_MIN_SIZE_IN_BYTES CRYS_HASH_SHA1_DIGEST_SIZE_IN_BYTES
- /*! Minimal size of DH seed in bits. */
- #define CRYS_DH_SEED_MIN_SIZE_IN_BITS (CRYS_DH_SEED_MIN_SIZE_IN_BYTES * 8)
- /************************ Enums ********************************/
- /************************ Typedefs ****************************/
- /* temp buffers, used in different DH KG functions */
- /*! Temporary data buffer structure for domain parameters generation in DH. */
- typedef struct CRYS_DHKGData_t
- {
- /* The aligned input and output temp buffers */
- /*! Temporary buffer. */
- uint32_t TempBuff1[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- uint32_t TempBuff2[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- uint32_t TempBuff3[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- uint32_t TempBuff4[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- uint32_t TempBuff5[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- uint32_t TempBuff6[CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- CRYS_DH_Temp_t ExpTemps;
- }CRYS_DHKGData_t;
- /*! Temporary buffer structure . */
- typedef struct CRYS_DHKG_CheckTemp_t
- {
- /*! Temporary buffer. */
- uint32_t CheckTempBuff[3*CRYS_DH_MAX_MOD_BUFFER_SIZE_IN_WORDS];
- /*! Temporary buffer. */
- CRYS_DHKGData_t DhKgBuff;
- }CRYS_DHKG_CheckTemp_t;
- /*! DH Domain generation values definitions */
- /*! Minimal modulus size for X942 - 1024.*/
- #define DH_X942_PRIME_MOD_MIN_VAL 1024
- /*! Maximal modulus size for X942 - 2048.*/
- #define DH_X942_PRIME_MOD_MAX_VAL 2048
- /*! PGeneration counter for X942 - 4096.*/
- #define DH_X942_PGEN_COUNTER_CONST 4096
- /*! HASH size in bits for X942 - 160.*/
- #define DH_X942_HASH_SIZE_BITS 160
- /*! Maximal allowed ratio between modulus and generator order sizes (by implementation) */
- #define DH_MAX_RATIO_MODULO_TO_ORDER 4
- /************************ Structs ******************************/
- /************************ Public Variables **********************/
- /************************ Public Functions **********************/
- /******************************************************************************************/
- /*!
- @brief This function generates DH domain parameters in Galois prime field according to standard [ANS X9.42].
- It receives the required sizes (in bits) of the modulus, the generator's order, and the seed, and then generates
- the prime modulus and the generator according to given sizes.
- If generateSeed argument is set to 1, the function generates and outputs the random seed. Otherwise (if set to 0),
- the seed has to be passed as an input argument. According to implementation the seed should be not greate, than (2^seedSizeBits - 2^32).
- The seed and some additional parameters, generated by the function (factorJ, pgenCounter), are used for checking
- that all domain parameters are generated according to the standard and not forged.
- \note All buffer parameters should be in Big-Endian form.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_dh_error.h, crys_rnd_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_DH_CreateDomainParams(
- void *rndState_ptr, /*!< [in/out] Pointer to the RND state structure. */
- SaSiRndGenerateVectWorkFunc_t rndGenerateVectFunc, /*!< [in] Pointer to a random vector generation function. */
- uint32_t modPsizeBits, /*!< [in] Size of the modulus (Prime) in bits equal 256*n, where n >= 4. FIPS 186-4
- defines sizes 1024 and 2048 bit. */
- uint32_t orderQsizeBits, /*!< [in] Size of the Generator's order in bits. FIPS 186-4 defines orderQSizeBits = 160
- for modulus 1024 bit and 224 or 256 bit for modPSizeBits = 2048. We not recommend
- sizes > 256 and returns an error if orderQSizeBits > modPSizeBits/4 */
- uint32_t seedSizeBits, /*!< [in] Seed size in bits. Requirements: modPSizeBits >= seedSizeBits >= orderQSizeBits
- (the first is required by our implementation). */
- uint8_t *modP_ptr, /*!< [out] Pointer to the modulus (prime) buffer. The size of the buffer for output
- generated value must be no less than given modulus size. */
- uint8_t *orderQ_ptr, /*!< [out] Pointer to the order Q of generator. The size of the buffer for output generated
- value must be no less than the given order size. */
- uint8_t *generatorG_ptr, /*!< [out] Pointer to the generator of multiplicative subgroup in GF(P).
- If the user does not need this output, then both the pointer and the buffer size
- must be set to 0. */
- uint32_t *generGsizeBytes_ptr, /*!< [in/out] Pointer to the one word buffer for outputting the generator's size.
- The passed size (if needed) must be not less than modulus size and the function
- returns the actual size of the generator. */
- uint8_t *factorJ_ptr, /*!< [out] Pointer to the buffer for integer factor J. If NULL, the function does not output
- this parameter (in this case JsizeBytes_ptr also must be set to NULL, else the function
- returns an error). */
- uint32_t *JsizeBytes_ptr, /*!< [in/out] Pointer to the size of integer factor J. If NULL, the function does not output
- this parameter. */
- uint8_t *seedS_ptr, /*!< [in/out] Random seed used for prime generation. The size of the buffer must be
- at least the seed size. */
- int8_t generateSeed, /*!< [in] Flag, defining whether the seed should be generated randomly by the function
- (1) or is passed by the user (0). */
- uint32_t *pgenCounter_ptr, /*!< [out] Pointer to counter of tries to generate the primes. If NULL, the function does not
- output this parameter. */
- CRYS_DHKGData_t *DHKGbuff_ptr /*!< [out] The temp buffer of defined structure for internal calculations. */
- );
- /******************************************************************************************/
- /*!
- @brief This function receives DH domain parameters, seed and prime generation counter and then verifies
- that the domain was created according to the standard [ANS X9.42].
- According to implementation, the value of the user passed seed should be not
- greate, than (2^seedSizeBits - 2^32), otherwise an error is returned.
- \note All buffer parameters should be in Big-Endian form. For more detailed
- description of the parameters see ::CRYS_DH_CreateDomainParams.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_dh_error.h, crys_rnd_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_DH_CheckDomainParams(
- void *rndState_ptr, /*!< [in/out] Pointer to the RND state. */
- SaSiRndGenerateVectWorkFunc_t rndGenerateVectFunc, /*!< [in/out] Pointer to the RND Generate vector function pointer. */
- uint8_t *modP_ptr, /*!< [in] Pointer to the modulus (Prime). */
- uint32_t modPsizeBytes, /*!< [in] Size of the modulus (Prime) in bytes. */
- uint8_t *orderQ_ptr, /*!< [in] Pointer to the order Q of generator. The size of the buffer for output
- generated value must be no less than the order size. */
- uint32_t orderQsizeBytes, /*!< [in] Size of the Generator's order in bytes. */
- uint8_t *generatorG_ptr, /*!< [in] Pointer to the generator of the multiplicative subgroup in GF(P). */
- uint32_t generatorSizeBytes, /*!< [in] Size of the generator in bytes. */
- uint8_t *seedS_ptr, /*!< [in] Random seed used for prime generation. */
- uint32_t seedSizeBits, /*!< [in] Seed size in bits. */
- uint32_t pgenCounter, /*!< [in] Counter of prime generation attempts. */
- CRYS_DHKG_CheckTemp_t *checkTempBuff_ptr /*!< [in] Temporary buffer for internal calculations. */
- );
- #ifdef __cplusplus
- }
- #endif
- /**
- @}
- */
- #endif
|