Skip to main content

c_encryptmatrix.c

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

#include <stdio.h>
#include <string.h>
#include <memory.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;

/* Initialize the TE environment */
TEEnvInit();

/* Open connection to KeyServer */
{
char * szServerName = "localhost"; /* server name */
long lPort = 8888; /* port number */
char * szUserName = "ls"; /* user name */
char * szPassword = "password1A"; /* password */

/* Open a connection */
h = OpenConnectionWithNativeUser(
TE_SSL_CONNECTION, /* connection type */
szServerName, /* TE server name */
lPort, /* TE server port */
szUserName, /* user name */
strlen(szUserName), /* user name length */
szPassword, /* password */
strlen(szPassword) /* password length */
);
if (h == 0)
{
PrintError("Connection error:");
goto CLEANUP1;
}
else
printf("Connected to %s at %d as %s\n", szServerName, lPort, szUserName);
}

/* Encrypt/Decrypt matrix */
{
#define ROW_NUM 5
#define COL_NUM 5
#define DATA_LEN 128
#define HL_LEN 60

char data[ROW_NUM][COL_NUM][DATA_LEN]; /* original data */
char data_enc[ROW_NUM][COL_NUM][DATA_LEN]; /* encrypted data */
char data_dec[ROW_NUM][COL_NUM][DATA_LEN]; /* decrypted data */
char hl[ROW_NUM][HL_LEN]; /* hiddenlink */

int datalen_enc[ROW_NUM][COL_NUM]; /* length of encrypted data */
int hllen[ROW_NUM]; /* length of hiddenlink */

TE_MATRIX_HANDLE mh = 0; /* TE matrix handle */
TE_MATRIX_HANDLE mh2 = 0;
int i, j;

/* Set original data */
printf("Original data:\n");
for(i=0; i<ROW_NUM; i++)
{
for(j=0; j<COL_NUM; j++)
{
sprintf(data[i][j], "this is data at row %d and colum %d", i, j);
printf("data[%d][%d] = %s\n", i, j, data[i][j]);
}
}

/* Set matric elements */
mh = TEMatrixCreate();
for(i=0; i<ROW_NUM; i++)
{
for(j=0; j<COL_NUM; j++)
{
ret = TEMatrixSetElement(mh, i+1, j+1, data[i][j], strlen(data[i][j]));
if(ret) {
PrintError("TEMatrixSetElement() failed:");
goto CLEANUP2;
}
}
}

/* Encrypt matrix */
ret = TEMatrixEncrypt(h, mh);
if(ret) {
PrintError("TEMatrixEncrypt() failed:");
goto CLEANUP2;
}

TEMatrixSetEncode(mh, 1); /* set data format */

/* Get encrypted data and hidden link */
printf("Encrypted data:\n");
for(i=0; i<ROW_NUM; i++)
{
for(j=0; j<COL_NUM; j++)
{

ret = TEMatrixGetElement(mh, i+1, j+1, data_enc[i][j], DATA_LEN, &datalen_enc[i][j]);
if(ret) {
PrintError("TEMatrixGetElement() failed:");
goto CLEANUP2;
}
if(TEMatrixGetEncode(mh))
printf("data_enc[%d][%d] = %s\n", i, j, data_enc[i][j]);
else
printf("datalen_enc[%d][%d] = %d\n", i, j, datalen_enc[i][j]);
}

ret = TEMatrixGetHiddenLink(mh, i+1, hl[i], HL_LEN, &hllen[i]);
if(ret) {
PrintError("TEMatrixGetHiddenLink() failed:");
goto CLEANUP2;
}
if(TEMatrixGetEncode(mh))
printf("hllen[%d] = %s\n", i, hl[i]);
else
printf("hllen[%d] = %d\n", i, hllen[i]);
}


/* Prepare matrix for decryption */
mh2 = TEMatrixCreate();

TEMatrixSetDecode(mh2, 1); /* set data format */

/* Set encrypted data and hidden link */
for(i=0; i<ROW_NUM; i++)
{
for(j=0; j<COL_NUM; j++)
{
ret = TEMatrixSetElement(mh2, i+1, j+1, data_enc[i][j], datalen_enc[i][j]);
if(ret) {
PrintError("TEMatrixSetElement() failed:");
goto CLEANUP3;
}
}

ret = TEMatrixSetHiddenLink(mh2, i+1, hl[i], hllen[i]);
if(ret) {
PrintError("TEMatrixSetHiddenLink() failed:");
goto CLEANUP3;
}
}


/* Decrypt matrix */
ret = TEMatrixDecrypt(h, mh2);
if(ret) {
PrintError("TEMatrixDecrypt() failed:");
goto CLEANUP3;
}

/* Get decrypted data and hidden link */
printf("Decrypted data:\n");
for(i=0; i<ROW_NUM; i++)
{
for(j=0; j<COL_NUM; j++)
{
int nLen;
memset(data_dec[i][j], 0, DATA_LEN);
ret = TEMatrixGetElement(mh2, i+1, j+1, data_dec[i][j], DATA_LEN, &nLen);
if(ret) {
PrintError("TEMatrixGetElement() failed:");
goto CLEANUP3;
}
printf("data_dec[%d][%d] = %s\n", i, j, data_dec[i][j]);
}
}

printf("Test matrix OK\n");

CLEANUP3:
TEMatrixRelease(mh2);

CLEANUP2:
TEMatrixRelease(mh);
}


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

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

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