123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 |
- /**************************************************************************************
- * 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. *
- **************************************************************************************/
- /*!
- @file
- @brief This file contains all of the enums and definitions that are used for the
- CRYS SRP APIs, as well as the APIs themselves.
- @defgroup crys_srp CryptoCell SRP APIs
- @{
- @ingroup cryptocell_api
- */
- #ifndef CRYS_SRP_H
- #define CRYS_SRP_H
- #include "ssi_pal_types.h"
- #include "crys_error.h"
- #include "crys_pka_defs_hw.h"
- #include "crys_hash.h"
- #include "crys_rnd.h"
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*!\internal The following describes the SRP APIs usage for the Device and the Accessory :*
- Device (User) Accessory (Host)
- * -------------- -----------------
- 1. CRYS_SRP_HK_INIT(CRYS_SRP_USER, .......) CRYS_SRP_HK_INIT(CRYS_SRP_HOST, .....)
- 2. CRYS_SRP_PwdVerCreate(..)
- 3. CRYS_SRP_UserPubKeyCreate(..) CRYS_SRP_HostPubKeyCreate(..)
- 4. CRYS_SRP_UserProofCalc(..)
- 5. CRYS_SRP_HostProofVerifyAndCalc(..)
- 6. CRYS_SRP_UserProofVerify(..)
- 7. CRYS_SRP_Clear(..) CRYS_SRP_Clear(..)
- */
- /************************ Defines ******************************/
- /*! The SRP modulus sizes. */
- /*! 1024 bits modulus size. */
- #define CRYS_SRP_MODULUS_SIZE_1024_BITS 1024
- /*! 1536 bits modulus size. */
- #define CRYS_SRP_MODULUS_SIZE_1536_BITS 1536
- /*! 2048 bits modulus size. */
- #define CRYS_SRP_MODULUS_SIZE_2048_BITS 2048
- /*! 3072 bits modulus size. */
- #define CRYS_SRP_MODULUS_SIZE_3072_BITS 3072
- /*! Maximal modulus size in bits. */
- #define CRYS_SRP_MAX_MODULUS_IN_BITS CRYS_SRP_MODULUS_SIZE_3072_BITS
- /*! Maximal modulus size in bytes. */
- #define CRYS_SRP_MAX_MODULUS (CRYS_SRP_MAX_MODULUS_IN_BITS/SASI_BITS_IN_BYTE)
- /*! Maximal modulus size in words. */
- #define CRYS_SRP_MAX_MODULUS_IN_WORDS (CRYS_SRP_MAX_MODULUS_IN_BITS/SASI_BITS_IN_32BIT_WORD)
- /*! The SRP private number size range. */
- /*! Minimal private number size in bits. */
- #define CRYS_SRP_PRIV_NUM_MIN_SIZE_IN_BITS (256)
- /*! Minimal private number size in bytes. */
- #define CRYS_SRP_PRIV_NUM_MIN_SIZE (CRYS_SRP_PRIV_NUM_MIN_SIZE_IN_BITS/SASI_BITS_IN_BYTE)
- /*! Minimal private number size in words. */
- #define CRYS_SRP_PRIV_NUM_MIN_SIZE_IN_WORDS (CRYS_SRP_PRIV_NUM_MIN_SIZE_IN_BITS/SASI_BITS_IN_32BIT_WORD)
- /*! Maximal private number size in bits. */
- #define CRYS_SRP_PRIV_NUM_MAX_SIZE_IN_BITS (CRYS_SRP_MAX_MODULUS_IN_BITS)
- /*! Maximal private number size in bytes. */
- #define CRYS_SRP_PRIV_NUM_MAX_SIZE (CRYS_SRP_PRIV_NUM_MAX_SIZE_IN_BITS/SASI_BITS_IN_BYTE)
- /*! Maximal private number size in words. */
- #define CRYS_SRP_PRIV_NUM_MAX_SIZE_IN_WORDS (CRYS_SRP_PRIV_NUM_MAX_SIZE_IN_BITS/SASI_BITS_IN_32BIT_WORD)
- /*! Maximal SRP HASH digest size in words. */
- #define CRYS_SRP_MAX_DIGEST_IN_WORDS CRYS_HASH_RESULT_SIZE_IN_WORDS
- /*! Maximal SRP HASH digest size in bytes. */
- #define CRYS_SRP_MAX_DIGEST (CRYS_SRP_MAX_DIGEST_IN_WORDS*SASI_32BIT_WORD_SIZE)
- /*! Minimal salt size in bytes. */
- #define CRYS_SRP_MIN_SALT_SIZE (8)
- /*! Minimal salt size in words. */
- #define CRYS_SRP_MIN_SALT_SIZE_IN_WORDS (CRYS_SRP_MIN_SALT_SIZE/SASI_32BIT_WORD_SIZE)
- /*! Maximal salt size in bytes. */
- #define CRYS_SRP_MAX_SALT_SIZE (64)
- /*! Maximal salt size in words. */
- #define CRYS_SRP_MAX_SALT_SIZE_IN_WORDS (CRYS_SRP_MAX_SALT_SIZE/SASI_32BIT_WORD_SIZE)
- /************************ Typedefs ****************************/
- /*! SRP modulus buffer definition. */
- typedef uint8_t CRYS_SRP_Modulus_t[CRYS_SRP_MAX_MODULUS];
- /*! SRP digest buffer definition. */
- typedef uint8_t CRYS_SRP_Digest_t[CRYS_SRP_MAX_DIGEST];
- /*! SRP secret buffer definition. */
- typedef uint8_t CRYS_SRP_Secret_t[2*CRYS_SRP_MAX_DIGEST];
- /************************ Enums ********************************/
- /*!
- SRP supported versions
- */
- typedef enum {
- CRYS_SRP_VER_3 = 0, /*!< VER 3. */
- CRYS_SRP_VER_6 = 1, /*!< VER 6. */
- CRYS_SRP_VER_6A = 2, /*!< VER 6A. */
- CRYS_SRP_VER_HK = 3, /*!< VER 6A. */
- /*! Maximal number of supported versions.*/
- CRYS_SRP_NumOfVersions,
- /*! Reserved.*/
- CRYS_SRP_VersionLast= 0x7FFFFFFF,
- }CRYS_SRP_Version_t;
- /*!
- SRP entity type
- */
- typedef enum {
- CRYS_SRP_HOST = 1, /*!< Host entity, called also server, verifier, or Accessory in Home-Kit */
- CRYS_SRP_USER = 2, /*!< User entity, called also client, or Device in Home-Kit */
- /*! Maximal number of entities types.*/
- CRYS_SRP_NumOfEntityType,
- /*! Reserved.*/
- CRYS_SRP_EntityLast= 0x7FFFFFFF,
- }CRYS_SRP_Entity_t;
- /************************ Structs ******************************/
- /*! Group parameters for the SRP - defines the modulus and the generator used */
- typedef struct CRYS_SRP_GroupParam_t {
- /*! SRP modulus.*/
- CRYS_SRP_Modulus_t modulus;
- /*! SRP generator.*/
- uint8_t gen;
- /*! SRP modulus size in bits .*/
- size_t modSizeInBits;
- /*! SRP valid Np.*/
- uint32_t validNp;
- /*! SRP Np buffer.*/
- uint32_t Np[CRYS_PKA_BARRETT_MOD_TAG_BUFF_SIZE_IN_WORDS];
- }CRYS_SRP_GroupParam_t;
- /************************ context Structs ******************************/
- /*! The SRP context prototype */
- typedef struct CRYS_SRP_Context_t {
- /*! SRP entitiy type.*/
- CRYS_SRP_Entity_t srpType;
- /*! SRP version.*/
- CRYS_SRP_Version_t srpVer;
- /*! Group parameter including the modulus information.*/
- CRYS_SRP_GroupParam_t groupParam; // N, g, Np
- /*! Hash mode.*/
- CRYS_HASH_OperationMode_t hashMode;
- /*! Hash digest size.*/
- size_t hashDigestSize;
- /*! Pointer to RND state.*/
- CRYS_RND_State_t *pRndState;
- /*! Pointer to random vector generation function.*/
- SaSiRndGenerateVectWorkFunc_t rndGenerateVectFunc;
- /*! Modulus.*/
- CRYS_SRP_Modulus_t ephemPriv; // a or b
- /*! Modulus size.*/
- size_t ephemPrivSize;
- /*! User name digest.*/
- CRYS_SRP_Digest_t userNameDigest; // M
- /*! Cred digest.*/
- CRYS_SRP_Digest_t credDigest; // p
- /*! SRP K multiplier. */ //
- CRYS_SRP_Digest_t kMult; // k multiplier
- }CRYS_SRP_Context_t;
- /************************ SRP common Functions **********************/
- /****************************************************************************************************/
- /*!
- @brief This function initiates the SRP context.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_Init(
- CRYS_SRP_Entity_t srpType, /*!< [in] SRP entity type. */
- CRYS_SRP_Version_t srpVer, /*!< [in] SRP version. */
- CRYS_SRP_Modulus_t srpModulus, /*!< [in] A pointer to the SRP modulus, BE byte buffer. */
- uint8_t srpGen, /*!< [in] The SRP generator param. */
- size_t modSizeInBits, /*!< [in] The SRP modulus size in bits:1024, 1536, 2048 & 3072 */
- CRYS_HASH_OperationMode_t hashMode, /*!< [in] Enumerator defining the HASH mode. */
- uint8_t *pUserName, /*!< [in] A Pointer to user name. */
- size_t userNameSize, /*!< [in] The user name buffer size > 0. */
- uint8_t *pPwd, /*!< [in] A Pointer to user password. */
- size_t pwdSize, /*!< [in] The user password buffer size > 0 if pPwd is valid. */
- void *pRndState, /*!< [in] A Pointer to RND context.*/
- SaSiRndGenerateVectWorkFunc_t rndGenerateVectFunc, /*!< [in] Pointer to random vector generation function.*/
- CRYS_SRP_Context_t *pCtx /*!< [out] A Pointer to the SRP host context.*/
- );
- /*! MACRO definition for a specific SRP initialization function.*/
- #define CRYS_SRP_HK_INIT(srpType, srpModulus, srpGen, modSizeInBits, pUserName, userNameSize, pPwd, pwdSize, pRndState, rndGenerateVectFunc, pCtx) \
- CRYS_SRP_Init(srpType, CRYS_SRP_VER_HK, srpModulus, srpGen, modSizeInBits, CRYS_HASH_SHA512_mode, pUserName, userNameSize, pPwd, pwdSize, pRndState, rndGenerateVectFunc, pCtx)
- /****************************************************************************************************/
- /*!
- @brief This function calculates pSalt & password verifier
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h, crys_rnd_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_PwdVerCreate(
- size_t saltSize, /*!< [in] The size of the random salt to generate,
- The range is between CRYS_SRP_MIN_SALT_SIZE
- to CRYS_SRP_MAX_SALT_SIZE. */
- uint8_t *pSalt, /*!< [out] A Pointer to the pSalt number (s).*/
- CRYS_SRP_Modulus_t pwdVerifier, /*!< [out] A Pointer to the password verifier (v). */
- CRYS_SRP_Context_t *pCtx /*!< [out] A Pointer to the SRP context.*/
- );
- /****************************************************************************************************/
- /*!
- @brief Clears the SRP context.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_Clear(
- CRYS_SRP_Context_t *pCtx /*!< [in/out] A Pointer to the SRP context.*/
- );
- /************************ SRP Host Functions **********************/
- /****************************************************************************************************/
- /*!
- @brief This function generates host public & private ephemeral key, known as B & b in RFC
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_rnd_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_HostPubKeyCreate(
- size_t ephemPrivSize, /*!< [in] The size of the generated ephemeral private key (b).
- The range is between CRYS_SRP_PRIV_NUM_MIN_SIZE to
- CRYS_SRP_PRIV_NUM_MAX_SIZE */
- CRYS_SRP_Modulus_t pwdVerifier, /*!< [in] A Pointer to the verifier (v). */
- CRYS_SRP_Modulus_t hostPubKeyB, /*!< [out] A Pointer to the host ephemeral public key (B). */
- CRYS_SRP_Context_t *pCtx /*!< [in/out] A Pointer to the SRP context.*/
- );
- /*!
- @brief Verifies the user Proof and calculates the Host message proof.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_HostProofVerifyAndCalc(
- size_t saltSize, /*!< [in] The size of the random salt,
- The range is between CRYS_SRP_MIN_SALT_SIZE
- to CRYS_SRP_MAX_SALT_SIZE. */
- uint8_t *pSalt, /*!< [in] A Pointer to the pSalt number.*/
- CRYS_SRP_Modulus_t pwdVerifier, /*!< [in] A Pointer to the password verifier (v). */
- CRYS_SRP_Modulus_t userPubKeyA, /*!< [in] A Pointer to the user ephemeral public key (A). */
- CRYS_SRP_Modulus_t hostPubKeyB, /*!< [in] A Pointer to the host ephemeral public key (B). */
- CRYS_SRP_Digest_t userProof, /*!< [in] A Pointer to the SRP user proof buffer (M1).*/
- CRYS_SRP_Digest_t hostProof, /*!< [out] A Pointer to the SRP host proof buffer (M2).*/
- CRYS_SRP_Secret_t sharedSecret, /*!< [out] A Pointer to the SRP shared secret (K).*/
- CRYS_SRP_Context_t *pCtx /*!< [in] A Pointer to the SRP context.*/
- );
- /************************ SRP User Functions **********************/
- /****************************************************************************************************/
- /*!
- @brief This function generates user public & private ephemeral key, known as A & a in RFC
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_rnd_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_UserPubKeyCreate(
- size_t ephemPrivSize, /*!< [in] The size of the generated ephemeral private key (a).
- The range is between CRYS_SRP_PRIV_NUM_MIN_SIZE to
- CRYS_SRP_PRIV_NUM_MAX_SIZE */
- CRYS_SRP_Modulus_t userPubKeyA, /*!< [out] A Pointer to the user ephemeral public key (A). */
- CRYS_SRP_Context_t *pCtx /*!< [in/out] A Pointer to the SRP context.*/
- );
- /****************************************************************************************************/
- /*!
- @brief This function calculates the user proof.
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_UserProofCalc(
- size_t saltSize, /*!< [in] The size of the random salt,
- The range is between CRYS_SRP_MIN_SALT_SIZE
- to CRYS_SRP_MAX_SALT_SIZE. */
- uint8_t *pSalt, /*!< [in] A Pointer to the pSalt number.*/
- CRYS_SRP_Modulus_t userPubKeyA, /*!< [in] A Pointer to the user public ephmeral key (A).*/
- CRYS_SRP_Modulus_t hostPubKeyB, /*!< [in] A Pointer to the host public ephmeral key (B).*/
- CRYS_SRP_Digest_t userProof, /*!< [out] A Pointer to the SRP user proof buffer (M1).*/
- CRYS_SRP_Secret_t sharedSecret, /*!< [out] A Pointer to the SRP shared secret (K).*/
- CRYS_SRP_Context_t *pCtx /*!< [out] A Pointer to the SRP context.*/
- );
- /****************************************************************************************************/
- /*!
- @brief This function verifies the host proof
- @return CRYS_OK on success.
- @return A non-zero value on failure as defined crys_srp_error.h or crys_hash_error.h.
- */
- CIMPORT_C CRYSError_t CRYS_SRP_UserProofVerify(
- CRYS_SRP_Secret_t sharedSecret, /*!< [in] A Pointer to the SRP shared secret (K).*/
- CRYS_SRP_Modulus_t userPubKeyA, /*!< [in] A Pointer to the user public ephmeral key (A).*/
- CRYS_SRP_Digest_t userProof, /*!< [in] A Pointer to the SRP user proof buffer (M1).*/
- CRYS_SRP_Digest_t hostProof, /*!< [in] A Pointer to the SRP host proof buffer (M2).*/
- CRYS_SRP_Context_t *pCtx /*!< [out] A Pointer to the SRP user context.*/
- );
- #ifdef __cplusplus
- }
- #endif
- /**
- @}
- */
- #endif /* #ifndef CRYS_SRP_H */
|