Skip to main content

c_exportmultikeys.c

/****************************************************************************************
* c_exportmultiplekey.c
*
* Note: See Tricryption Engine SDK for details on how to set the project environment.
*
*****************************************************************************************/

#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;
uint64_t pid; /* 8.0.1: CurrentLogonPrincipalId/TEExportMultiKeys widened Principal ID to 64-bit */

/* 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:");
goto CLEANUP;
}
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 = %llu\n", (unsigned long long)pid);
}

/* Create and export multiple keys with TEExportMultiKeys() */
{
#define KEY_NUMBER 3
#define KEY_BUFFER_SIZE 256
#define HIDDENLINK_BUFFER_SIZE 60

TE_KEY_BUFFER tekeybuffer[KEY_NUMBER];
int i, j;

// Initialize key and hiddenlink buffers
for (i=0; i<KEY_NUMBER; i++)
{
tekeybuffer[i].key.buffer = (unsigned char*)malloc(KEY_BUFFER_SIZE);
if(tekeybuffer[i].key.buffer == NULL) {
printf("Error: out of memory.\n");
for(j=0; j<i; j++) {
free(tekeybuffer[j].key.buffer); /* clean up */
}
goto CLEANUP;
}
tekeybuffer[i].key.size = KEY_BUFFER_SIZE;
tekeybuffer[i].key.len = 0;

tekeybuffer[i].hiddenlink.buffer = (unsigned char*)malloc(HIDDENLINK_BUFFER_SIZE);
if(tekeybuffer[i].hiddenlink.buffer == NULL) {
printf("Error: out of memory.\n");
for(j=0; j<=i; j++) {
free(tekeybuffer[j].key.buffer); /* clean up */
}
for(j=0; j<i; j++) {
free(tekeybuffer[j].hiddenlink.buffer); /* clean up */
}
goto CLEANUP;
}
tekeybuffer[i].hiddenlink.size = HIDDENLINK_BUFFER_SIZE;
tekeybuffer[i].hiddenlink.len = 0; /* new key will be created. */
}

ret = TEExportMultiKeys(
h, /* connection handle */
sid, /* system id */
pid, /* principal id */
tekeybuffer, /* keys and their hidden link information */
KEY_NUMBER /* number of key data */
);

if(ret) {
PrintError("TEExportMultiKeys() failed:");
}
else {
for (i=0; i<KEY_NUMBER; i++)
{
printf("tekeybuffer[%d].key.buffer (len = %d) :\n", i, tekeybuffer[i].key.len);
for(j=0; j<tekeybuffer[i].key.len; j++) {
printf("[%2x] ", tekeybuffer[i].key.buffer[j]);
}
printf("\n");
}
}

/* Free key and hiddenlink buffers */
for (i=0; i<KEY_NUMBER; i++)
{
free(tekeybuffer[i].key.buffer);
free(tekeybuffer[i].hiddenlink.buffer);
}
}

CLEANUP:
/* Close a connection */
CloseConnection(h);

printf("Disconnected from server\n\n");

/* Uninitialize the TE environment */
TEEnvClose();
return 0;
}