NXP Reader Library  v17.1.0.2535

Example code to Compute Shared secret between both the parties. More...

Collaboration diagram for 07_ECDH:

Example code to Compute Shared secret between both the parties.

/* Reader Library Headers. */
#include <phKeyStore.h>
#include <phCryptoASym.h>
/* Standard Header. */
#include <string.h>
#define CHECK_SUCCESS(x) \
if ( (x) != PH_ERR_SUCCESS ) \
{ \
printf ( "\n\n" ); \
printf ( "An error occurred: (0x%04X)\n", (x) ); \
printf ( "Pressing any key will exit the demo.\n" ); \
_getch (); \
return 0; \
}
#define KEY_ENTRIES 10
#define KEY_VERSION_PAIRS 3 * KEY_ENTRIES
#define KEY_USAGE_COUNTER 15
#define TRUE PH_ON
#define FALSE PH_OFF
#define KEY_ADDRESS 1
#define KEY_PAIR_PRIVATE_KEY 0
#define KEY_PAIR_PUBLIC_KEY 1
/* Variables */
phStatus_t wStatus = 0;
uint8_t aKey[256];
uint16_t wKeyLen = 0;
uint16_t wOption = 0;
uint8_t aSharedSecret[64];
uint16_t wSharedSecretLen = 0;
uint8_t aPublicKey[] =
{
0x04, 0xC4, 0x18, 0x7C, 0x26, 0xA5, 0x95, 0xB1, 0x8B, 0x37, 0x03, 0x31, 0x2D, 0x80, 0x12, 0x99,
0x9B, 0x88, 0xEB, 0x28, 0xBD, 0xB4, 0x1F, 0x30, 0x11, 0x28, 0x3D, 0xD8, 0x06, 0xEC, 0xDB, 0x09,
0x24, 0x1B, 0xA9, 0x9D, 0x61, 0x2D, 0xA5, 0x4A, 0x6E, 0xAF, 0x14, 0x0F, 0x80, 0xAB, 0x5B, 0x19,
0xE4, 0xBA, 0x66, 0x53, 0x5D, 0x12, 0xBE, 0x85, 0x3C, 0x98, 0x76, 0x7A, 0xDF, 0x7C, 0x13, 0x0C,
0x1A
};
phCryptoASym_Sw_DataParams_t stCryptoASym;
phKeyStore_Sw_KeyEntry_t aKeyEntry[KEY_ENTRIES];
phKeyStore_Sw_KeyVersionPair_t aKeyVersion[KEY_VERSION_PAIRS];
phKeyStore_Sw_KUCEntry_t aKeyUsageCounter[KEY_USAGE_COUNTER];
/* Initialize software keystore component. */
CHECK_SUCCESS(phKeyStore_Sw_Init(&stKeyStore, sizeof(stKeyStore), aKeyEntry, KEY_ENTRIES, aKeyVersion, 2,
aKeyUsageCounter, KEY_USAGE_COUNTER), TRUE);
/* Initialize ASymmetric component. */
CHECK_SUCCESS(phCryptoASym_Sw_Init(&stCryptoASym, sizeof(stCryptoASym), &stKeyStore, aInternalBuffer, wInternalBuffSize), TRUE);
/* Generate Keypair
* Here ECC key type with SECP256R1 as Curve are used for Key Pair generation.
*/
CHECK_SUCCESS(phCryptoASym_GenerateKeyPair(&stCryptoASym, PH_CRYPTOASYM_KEYMODE_EPHEMERAL, PH_CRYPTOASYM_KEY_TYPE_ECC,
PH_CRYPTOASYM_CURVE_BY_NAME, (uint8_t *) PH_CRYPTOASYM_CURVE_NAME_SECP256R1,
(uint16_t) strlen(PH_CRYPTOASYM_CURVE_NAME_SECP256R1)), TRUE);
/* Export and print Private key. */
printf("\tExporting Keys in Uncompressed Binary format (BigEndian).\n");
wOption = (uint16_t) (PH_CRYPTOASYM_PRIVATE_KEY | PH_CRYPTOASYM_KEY_FORMAT_BIN);
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\tPrivate Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n");
/* Print Public Key */
printf("\tPublic Key: ");
PrintData(aPublicKey, ( uint16_t )sizeof(aPublicKey), "%02X ", "\n\n\n");
/* Compute Shared Secret (ECDH) */
CHECK_SUCCESS(phCryptoASym_SharedSecret(&stCryptoASym, PH_CRYPTOASYM_KEY_FORMAT_BIN, aPublicKey, ( uint16_t )sizeof(aPublicKey),
aSharedSecret,, &wSharedSecretLen), TRUE);
printf("\tShared Secret: ");
PrintData(aSharedSecret, wSharedSecretLen, "%02X ", "\n\n\n");
/* Function to print the bytes. */
void PrintData(uint8_t* pBuffer, uint32_t dwLength, char* pFormat, char* pSpecialChar)
{
uint32_t dwSplit_Count = 128;
uint32_t dwIndex1 = 0;
uint32_t dwIndex2 = 0;
for(dwIndex1 = 0; dwIndex1 < dwLength;dwIndex1++)
{
printf(pFormat, pBuffer[dwIndex1]);
dwIndex2++;
if(dwIndex2 > (dwSplit_Count - 1))
{
printf("\n\t ");
dwIndex2 = 0;
}
}
printf(pSpecialChar);
}
phKeyStore_Sw_Init
phStatus_t phKeyStore_Sw_Init(phKeyStore_Sw_DataParams_t *pDataParams, uint16_t wSizeOfDataParams, phKeyStore_Sw_KeyEntry_t *pKeyEntries, uint16_t wNoOfKeyEntries, phKeyStore_Sw_KeyVersionPair_t *pKeyVersionPairs, uint16_t wNoOfVersionPairs, phKeyStore_Sw_KUCEntry_t *pKUCEntries, uint16_t wNoOfKUCEntries)
Initializes the KeyStore component as software component.
phKeyStore_Sw_KeyEntry_t
Software KeyEntry structure.
Definition: phKeyStore.h:66
phKeyStore_Sw_DataParams_t
Software parameter structure.
Definition: phKeyStore.h:82
phKeyStore_Sw_KeyVersionPair_t
Software KeyVersionPair structure for Symmetric and ASymmetric keys.
Definition: phKeyStore.h:51
phStatus_t
uint16_t phStatus_t
phcsBfl_Status_t is a signed short value, using the positive range.
Definition: ph_TypeDefs.h:158
uint16_t
unsigned short uint16_t
16 bit unsigned integer
Definition: ph_TypeDefs.h:62
phKeyStore_Sw_KUCEntry_t
Software KeyUsageCounter structure.
Definition: phKeyStore.h:75
PH_CRYPTOASYM_PRIVATE_KEY
#define PH_CRYPTOASYM_PRIVATE_KEY
Load / Export Private Key.
Definition: phCryptoASym.h:222
uint32_t
unsigned int uint32_t
32 bit unsigned integer
Definition: ph_TypeDefs.h:68
uint8_t
unsigned char uint8_t
8 bit unsigned integer
Definition: ph_TypeDefs.h:56
PH_CRYPTOASYM_KEY_TYPE_ECC
#define PH_CRYPTOASYM_KEY_TYPE_ECC
ASymmetric ECC (Elliptical Curve Cryptography) key type.
Definition: phCryptoASym.h:208