NXP Reader Library  v17.1.0.2535
04_ExportKey

Example code to export Private or Public Keys from Keystore. More...

Collaboration diagram for 04_ExportKey:

Example code to export Private or Public Keys from Keystore.

/* 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;
uint16_t wKeyInfo = 0;
uint8_t aKey[256];
uint16_t wKeyLen = 0;
uint8_t aPrivateKey[] =
{
0x60, 0x0A, 0xC0, 0xBA, 0x0A, 0x5B, 0x79, 0xB6, 0x07, 0x25, 0xA9, 0xC8, 0xFF, 0xB3, 0xE7, 0x45,
0x4A, 0x7C, 0x70, 0x2D, 0xB5, 0x65, 0x3A, 0x8A, 0xA6, 0x0E, 0x2E, 0x4C, 0x25, 0x6F, 0xF0, 0x5D
};
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);
/* Load keys to Keystore */
PH_CHECK_SUCCESS_FCT(wStatus, phKeyStore_FormatKeyEntry(&stKeyStore, bKeyNo, wKeyType));
/* Load a Private Key */
wKeyInfo = (uint16_t) ( ( ( KEY_PAIR_PRIVATE_KEY + 1 ) << 12 ) | wKeyFormat );
PH_CHECK_SUCCESS_FCT(wStatus, phKeyStore_SetKeyASym(&stKeyStore, KEY_ADDRESS, KEY_PAIR_PRIVATE_KEY, PH_KEYSTORE_KEY_TYPE_ECC, wKeyInfo,
aPrivateKey, ( uint16_t ) sizeof(aPrivateKey)));
/* Load a Public Key */
wKeyInfo = (uint16_t) ( ( ( KEY_PAIR_PUBLIC_KEY + 1 ) << 12 ) | wKeyFormat );
PH_CHECK_SUCCESS_FCT(wStatus, phKeyStore_SetKeyASym(&stKeyStore, KEY_ADDRESS, KEY_PAIR_PUBLIC_KEY, PH_KEYSTORE_KEY_TYPE_ECC, wKeyInfo,
aPublicKey, ( uint16_t ) sizeof(aPublicKey)));
/* Set the key format to CryptoASym Layer.
* Binary format is used in this example.
* Binary format is nothing but uncompressed point representation format in big endian.
* Its mandatory to set the curve type in case of binary format is used for loading of keys.
*/
CHECK_SUCCESS(phCryptoASym_SetConfig(&stCryptoASym, PH_CRYPTOASYM_CONFIG_CURVE_ID, PH_CRYPTOASYM_CURVE_ID_SECP256R1), TRUE);
/* Perfom LoadKey to load a private key from keystore */
CHECK_SUCCESS(phCryptoASym_LoadKey(&stCryptoASym, PH_CRYPTOASYM_KEYMODE_EPHEMERAL, KEY_ADDRESS, KEY_PAIR_PRIVATE_KEY, PH_CRYPTOASYM_KEY_TYPE_ECC), TRUE);
/* Perfom LoadKey to load a public key from keystore */
CHECK_SUCCESS(phCryptoASym_LoadKey(&stCryptoASym, PH_CRYPTOASYM_KEYMODE_EPHEMERAL, KEY_ADDRESS, KEY_PAIR_PUBLIC_KEY, PH_CRYPTOASYM_KEY_TYPE_ECC), TRUE);
/* Export 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("\t Private Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n");
/* Export Public Key */
wOption = (uint16_t) ( PH_CRYPTOASYM_PUBLIC_KEY | PH_CRYPTOASYM_KEY_FORMAT_BIN );
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\t Public Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n\n");
/* Export Private key. */
printf("\tExporting Keys in PEM (Privacy Enhanced Mail) format.\n");
wOption = (uint16_t) (PH_CRYPTOASYM_PRIVATE_KEY | PH_CRYPTOASYM_KEY_FORMAT_PEM);
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\t Private Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n");
/* Export Public Key */
wOption = (uint16_t) ( PH_CRYPTOASYM_PUBLIC_KEY | PH_CRYPTOASYM_KEY_FORMAT_PEM );
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\t Public Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n\n");
/* Export Private key. */
printf("\tExporting Keys in DER (Distinguished Encoding Rules) format.\n");
wOption = (uint16_t) (PH_CRYPTOASYM_PRIVATE_KEY | PH_CRYPTOASYM_KEY_FORMAT_DER);
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\t Private Key: ");
PrintData(aKey, wKeyLen, "%02X ", "\n\n");
/* Export Public Key */
wOption = (uint16_t) ( PH_CRYPTOASYM_PUBLIC_KEY | PH_CRYPTOASYM_KEY_FORMAT_DER );
CHECK_SUCCESS(phCryptoASym_ExportKey(&stCryptoASym, wOption, ( uint16_t )sizeof(aKey), aKey, &wKeyLen), TRUE);
printf("\t Public Key: ");
PrintData(aKey, wKeyLen, "%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 = 32;
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
PH_CRYPTOASYM_CURVE_ID_SECP256R1
#define PH_CRYPTOASYM_CURVE_ID_SECP256R1
Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1.
Definition: phCryptoASym.h:335
phStatus_t
uint16_t phStatus_t
phcsBfl_Status_t is a signed short value, using the positive range.
Definition: ph_TypeDefs.h:158
PH_KEYSTORE_KEY_TYPE_ECC
#define PH_KEYSTORE_KEY_TYPE_ECC
ASymmetric ECC (Elliptical Curve Cryptography) key type.
Definition: phKeyStore.h:561
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
phKeyStore_SetKeyASym
phStatus_t phKeyStore_SetKeyASym(void *pDataParams, uint16_t wKeyNo, uint16_t wPos, uint16_t wKeyType, uint16_t wKeyInfo, uint8_t *pKey, uint16_t wKeyLen)
Change a Asymmetric Private or Public key entry in Un-compressed Binary format.
PH_CRYPTOASYM_PUBLIC_KEY
#define PH_CRYPTOASYM_PUBLIC_KEY
Load / Export Public Key.
Definition: phCryptoASym.h:223
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
phKeyStore_FormatKeyEntry
phStatus_t phKeyStore_FormatKeyEntry(void *pDataParams, uint16_t wKeyNo, uint16_t wNewKeyType)
Format a key entry to a new KeyType.