blob: 83674ccbb6bd0a6e9f032270fe602fca71adbeec [file] [log] [blame]
/**
* @file tstHostCrypto.h
* @author NXP Semiconductors
* @version 1.0
* @par License
*
* Copyright 2016 NXP
* SPDX-License-Identifier: Apache-2.0
*
* @par Description
* Module implementing host based crypto functionality used in example programs.
* This module relies on the availability of OpenSSL / mbed TLS on the Host plaform.
* @par HISTORY
*
*/
#ifndef _TST_HOST_CRYPTO_H_
#define _TST_HOST_CRYPTO_H_
#include "sm_types.h"
#ifdef OPENSSL
#include <openssl/obj_mac.h>
#include <openssl/ecdsa.h>
#include <openssl/ecdh.h>
#include <openssl/sha.h>
#endif /* OPENSSL */
#ifdef MBEDTLS
#include <mbedtls/ecp.h>
#include <mbedtls/pk.h>
#include <mbedtls/ecdsa.h>
typedef mbedtls_pk_context EC_KEY;
#endif
#ifdef __cplusplus
extern "C" {
#endif
/**
* Structure storing an RSA key in a crypto library independent way
* Only ECC keys upto 512 bit (64 byte) supported
*/
typedef struct
{
U8 pub[256];
U16 pubLen;
U8 privP[128];
U16 privPLen;
U8 privQ[128];
U16 privQLen;
U8 privDp[128];
U16 privDpLen;
U8 privDq[128];
U16 privDqLen;
U8 privIpq[128];
U16 privIpqLen;
U16 bits; // Length of modulus in bits
} rsaKeyComponents_t;
/**
* Structure storing an ECC key in a crypto library independent way
* Only ECC keys upto 512 bit (64 byte) supported
*/
typedef struct
{
U8 pub[(64 << 1)+1+8]; //!< Public key stored as byte array + 8 for wrapping
U16 pubLen; //!< Length of pub (expressed as number of byte)
U8 priv[64+8]; //!< Private key stored as byte array + 8 for wrapping
U16 privLen; //!< Length of priv (expressed as number of byte)
U16 bits; //!< Length of private key expressed in bits
ECCCurve_t curve; //!< Curve type (e.g. ::ECCCurve_NIST_P256)
} eccKeyComponents_t;
#define SIGNATURE_ASN_WRAPPED 0
#define SIGNATURE_RAW 1
#if defined(OPENSSL) || defined(MBEDTLS)
/// @cond Not used in A71CH example programs
U16 HOSTCRYPTO_Sign(EC_KEY* pKey, U8* pInputData, U16 inputLength, U8* pSignature, U16* pSignatureLength, U8 signatureFormat);
/// @endcond
U16 HOSTCRYPTO_ECC_ComputeSharedSecret(EC_KEY *pKey, U8 *pubKey, U16 pubKeyLen, U8 *pSharedSecretData, U16 *pSharedSecretDataLen);
U16 HOSTCRYPTO_GetPublicKey(EC_KEY* pKey, U8* pPublicKeyData, U16* pPublicKeyLen, U16 maxPublicKeyLen);
U16 HOSTCRYPTO_GetPrivateKey(EC_KEY* pKey, U8* pPrivateKeyData, U16* pPrivateKeyLen, U16 maxPrivateKeyLen);
U16 HOSTCRYPTO_GenerateEccKey(ECCCurve_t curveType, EC_KEY** ppKey);
void HOSTCRYPTO_FreeEccKey(EC_KEY** ppKey);
U16 HOSTCRYPTO_EccCreateOpenSslEccFromComponents(EC_KEY **eccRef, eccKeyComponents_t *eccKc);
#endif /* defined(OPENSSL) || defined(MBEDTLS) */
U16 HOSTCRYPTO_AesUnwrapKeyRFC3394(const U8 *wrapKey, U16 wrapKeyLen, U8 *out, U16 *outLen, const U8 *in, U16 inLen);
U16 HOSTCRYPTO_AesWrapKeyRFC3394(const U8 *wrapKey, U16 wrapKeyLen, U8 *out, U16 *outLen, const U8 *in, U16 inLen);
#if defined(TGT_A71CH) || defined (TGT_A71CL)
U16 HOSTCRYPTO_HkdfExpandSha256(const U8 *secret, U16 secretLen, const U8 *info, U16 infoLen, U8 *derivedData, U16 derivedDataLen);
U16 HOSTCRYPTO_HkdfFullSha256(const U8 *salt, U16 saltLen, const U8 *secret, U16 secretLen, const U8 *info, U16 infoLen, U8 *derivedData, U16 derivedDataLen);
U16 HOSTCRYPTO_TlsPskCreatePremasterSecret(const U8 *secret, U16 secretLen, U8 *premasterSecret, U16 *premasterSecretLen);
U16 HOSTCRYPTO_TlsEcdhPskCreatePremasterSecret(const U8 *ecdhSS, U16 ecdhSSLen, const U8 *secret, U16 secretLen, U8 *premasterSecret, U16 *premasterSecretLen);
U16 HOSTCRYPTO_HmacSha256(const U8 *secret, U16 secretLen, const U8 *data, U16 dataLen, U8 *hmacData);
U16 HOSTCRYPTO_Tls1_2_P_Sha256(const U8 *secret, U16 secretLen, const U8 *seed, U16 seedLen, U8 *derivedData, U16 derivedDataLen);
#else
U16 HOSTCRYPTO_RsaGenerateKeyPairComponents(int bits, U8 *pN, U16 *pNLen, U8 *pP, U16 *pPLen, U8 *pQ, U16 *pQLen, U8 *pDp, U16 *pDpLen, U8 *pDq, U16 *pDqLen, U8 *pIpq, U16 *pIpqLen);
U16 HOSTCRYPTO_RsaGenerateKeyPair(int bits, rsaKeyComponents_t *rsaKeypair);
U16 HOSTCRYPTO_RsaSign(HASHAlgo_t hType, U8 *m, U16 mLen, U8 *sig, U16 *sigLen, rsaKeyComponents_t *rsaKc);
U16 HOSTCRYPTO_RSA_Sign(HASHAlgo_t hType, U8 *msg, U32 msgLen, U8 *sig, U16 *sigLen, rsaKeyComponents_t *rsaKc);
U16 HOSTCRYPTO_RSA_Verify(HASHAlgo_t hType, U8 *msg, U32 msgLen, U8 *sig, U32 sigLen, rsaKeyComponents_t *rsaKc, U8 *pVerified);
#endif
#ifdef TGT_A70CM
//
// Currently only 128 bits KEK and 128 bit keyToWrap is supported
//
U16 HOSTCRYPTO_WrapKeyDsmr40(U8 *kek, U16 kekLen, U8 *keyToWrap, U16 keyToWrapLen, U8 *iv, U16 ivLen, U8 *wrappedKey, U16 *wrappedKeyLen);
U16 HOSTCRYPTO_UnwrapKeyDsmr40(U8 *kek, U16 kekLen, U8 *keyToUnwrap, U16 keyToUnwrapLen, U8 *iv, U16 ivLen, U8 *unwrappedKey, U16 *unwrappedKeyLen);
#endif
#ifdef TGT_A70CI
U16 HOSTCRYPTO_GenerateEccKeyByName(int curveName, EC_KEY** ppKey);
int HOST_ECC_Verify(U8 * pHash, U16 hashLen, U8 * pPubKey, U16 pubKeyLen, U8 * pSig, U16 sigLen);
int HOST_ECC_GenerateKeyPair(U8 *pPublicKey, U16 *pPublicKeyLength, U8 *pPrivateKey, U16 *pPrivateKeyLength);
int HOST_ECC_ComputeSharedSecret(U8 * pPrvKey, U32 prvKeyLength, U8 * pPubKey, U16 pubKeyLen, U8* pSharedSecretData, U16* pSharedSecretLength, U16 maxSharedSecretLength);
int HOST_RSA_GenerateKeyPair(U8 * pN, U16 * pNLen, U8 * pP, U16 * pPLen, U8 * pQ, U16 * pQLen, U8 * pDp, U16 * pDpLen, U8 * pDq, U16 * pDqLen, U8 * pIpq, U16 * pIpqLen);
int HOST_RSA_Sign(U8 hashFunction, U8 *msg, U32 msgLen, U8 *sig, U32 * sigLen,
U8 * pP, U16 lengthP, U8 * pQ, U16 lengthQ, U8 * pDp, U16 lengthDp, U8 * pDq, U16 lengthDq, U8 * pIpq, U16 lengthIpq) ;
int HOST_RSA_Verify(U8 hashFunction, U8 *msg, U32 mlen, U8 *sig, U32 siglen, U8 * pPubkey, U16 pubKeyLen);
// OAEP decryption (using PKCS #1 v2.1) - only decryption (OAEP on host)
int HOST_RSA_Decrypt(U8 *userId,
U32 inDataLength,
U8 *pP,
U16 lengthP,
U8 *pQ,
U16 lengthQ,
U8 *pDp,
U16 lengthDp,
U8 *pDq,
U16 lengthDq,
U8 *pIpq,
U16 lengthIpq,
U8 *pOutData,
U16 *pOutDataLength);
// OAEP encryption (using PKCS #1 v2.1) - only encryption (OAEP on host)
int HOST_RSA_Encrypt(U8 *userId, U32 inDataLength, U8 *pPubKey, U16 lengthPubKey, U8 *pOutData, U16 *pOutDataLength);
#endif
#ifdef __cplusplus
}
#endif
#endif // _TST_HOST_CRYPTO_H_