Export Key in C
The TEExportKey() function is used to export a single key. You need to login as a certificate user in order to export a key. You need to provide the system id, principal id and the T-tag (referred to as HiddenLink in methods and attributes) when you call the TEExportKey() function. The returned key is encrypted with the public key of the certificate user. You can use the certificate user's private key to decrypt the exported key.
Code Samples
See the C environment settings for details on setting the project environment.
< c_exportkey.c>
/****************************************************************************************
* c_exportkey.c
*
*
*****************************************************************************************/
#include <stdio.h>
#include "teagent_c.h"
void PrintError(const char * msg)
{
char szErr[1024];
uint32_t nLength = 1024;
uint32_t nCode = GetLastTEError(szErr, &nLength);
printf("%s Code = 0x%x, Message = %s\n", msg, nCode, szErr);
}
int main()
{
TE_HANDLE h;
TE_RETCODE ret;
uint32_t sid;
uint32_t pid;
/* Initialize the TE environment */
TEEnvInit();
/* Open connection to KeyServer */
{
char * szServerName = "localhost"; /* server name */
long lPort = 8888; /* port number */
const char * p12_file = "/test_key.pfx";
const char * password = "password";
h = OpenConnectionWithPKCS12File(
szServerName, /* TE server name */
lPort, /* TE server port */
p12_file, /* PKCS12 file name */
password, /* password */
strlen(password) /* password length */
);
if (h == 0)
{
PrintError("Connection error:");
}
else
printf("Connected to %s at %d as certificate user with %s.\n", szServerName, lPort, p12_file);
ret = TEGetSystemId(h, &sid);
if(ret) {
PrintError("TEGetSystemId() failed:");
goto CLEANUP;
}
else
printf("sid = %d\n", sid);
ret = CurrentLogonPrincipalId(h, &pid);
if(ret) {
PrintError("CurrentLogonPrincipalId() failed:");
goto CLEANUP;
}
else
printf("pid = %d\n", pid);
}
/* create and export key */
{
#define KEY_BUFFER_SIZE 256
#define HIDDENLINK_BUFFER_SIZE 60
unsigned char hl[HIDDENLINK_BUFFER_SIZE];
int len;
int i;
/* create key */
{
char * algorithm = NULL; /* set to NULL or "" to use KeyServer default algorithm */
char * acltemplate = NULL; /* set to NULL or "" if no alc template is provided */
ret = TECreateKey(
h, /* connection handle */
algorithm, /* algorithm */
acltemplate, /* ACL template name */
hl, /* T-tag buffer */
HIDDENLINK_BUFFER_SIZE, /* T-tag buffer size */
&len /* returned T-tag data length */
);
if(ret) {
PrintError("Create key failed:");
goto CLEANUP;
}
else {
printf("hiddenlink (len = %d) :\n", len);
for(i=0; i<len; i++) {
printf("[%2x] ", hl[i]);
}
printf("\n");
}
}
/* export key with TEExportKey() */
{
TE_KEY_BUFFER tekeybuffer;
/* Initialize key and hiddenlink buffers */
tekeybuffer.key.buffer = (unsigned char*)malloc(KEY_BUFFER_SIZE);
if(tekeybuffer.key.buffer == NULL) {
printf("Error: out of memory.\n");
goto CLEANUP;
}
tekeybuffer.key.size = KEY_BUFFER_SIZE;
tekeybuffer.key.len = 0;
tekeybuffer.hiddenlink.buffer = (unsigned char*)malloc(HIDDENLINK_BUFFER_SIZE);
if(tekeybuffer.hiddenlink.buffer == NULL) {
printf("Error: out of memory.\n");
free(tekeybuffer.key.buffer); // clean up
goto CLEANUP;
}
tekeybuffer.hiddenlink.size = HIDDENLINK_BUFFER_SIZE;
tekeybuffer.hiddenlink.len = len; /* use existing key */
memcpy(tekeybuffer.hiddenlink.buffer, hl, len); /* set hiddenlink */
ret = TEExportKey(
h, /* connection handle */
sid, /* system id */
pid, /* principal id */
&tekeybuffer /* key and its T-tag information */
);
if(ret) {
PrintError("TEExportKey() failed:");
}
else {
printf("tekeybuffer.key.buffer (len = %d) :\n", tekeybuffer.key.len);
for(i=0; i<tekeybuffer.key.len; i++) {
printf("[%2x] ", tekeybuffer.key.buffer[i]);
}
printf("\n");
}
/* free key and hiddenlink buffers */
free(tekeybuffer.key.buffer);
free(tekeybuffer.hiddenlink.buffer);
}
}
CLEANUP:
/* Close a connection */
CloseConnection(h);
printf("Disconnected from server\n\n");
/* Uninitialize the TE environment */
TEEnvClose();
return 0;
}
Output
Connected to localhost at 8888 as certificate user with /test_key.pfx.
sid = 1
pid = 5009
hiddenlink (len = 40) :
[ 0] [ 0] [ 0] [ 1] [56] [92] [f3] [5d] [e6] [ b] [6a] [94] [41] [b4] [12] [d2] [db] [81] [3f] [25] [ 5] [ab] [a0] [eb]
[14] [40] [cf] [b3] [e8] [fe] [5e] [b7] [9c] [20] [fa] [8c] [c1] [bf] [dd] [c5]
tekeybuffer.key.buffer (len = 128) :
[a9] [eb] [3d] [42] [55] [c3] [b4] [70] [f1] [89] [c7] [4d] [e9] [39] [a2] [fe] [ca] [f6] [ 6] [ 4] [3d] [d9] [f4] [22]
[2b] [11] [eb] [c4] [7f] [e6] [70] [38] [33] [47] [93] [c1] [56] [51] [29] [ e] [67] [b9] [32] [2d] [38] [67] [51] [9a]
[1f] [be] [df] [28] [6e] [1c] [26] [51] [e2] [90] [b0] [17] [eb] [ac] [5e] [7b] [8e] [1d] [7f] [f2] [d4] [de] [99] [74]
[ce] [45] [74] [da] [32] [39] [ 4] [1e] [dd] [cf] [de] [4b] [cf] [19] [11] [da] [ a] [f0] [db] [5a] [5c] [44] [b9] [52]
[ 3] [2f] [f0] [46] [6b] [ 8] [fd] [a9] [62] [94] [2b] [92] [ 5] [bc] [33] [6b] [54] [5e] [fe] [7a] [b6] [93] [57] [28]
[19] [e1] [8c] [de] [8e] [19] [cc] [25]
Disconnected from server