summaryrefslogtreecommitdiffstats
path: root/examples/pk.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-27 16:43:11 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-27 16:43:11 +0200
commit9a2369d426b23f77884b01666370140d10b41c19 (patch)
tree075830ece81547905f07cf77a68fa4071bab1ef9 /examples/pk.c
parent3e9e7a872a76e085499b15089e16ad8c3a2d68fd (diff)
downloadcryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.tar.gz
cryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.tar.xz
cryptodev-linux-9a2369d426b23f77884b01666370140d10b41c19.zip
Implemented Diffie Hellman Key exchange.
Diffstat (limited to 'examples/pk.c')
-rw-r--r--examples/pk.c152
1 files changed, 151 insertions, 1 deletions
diff --git a/examples/pk.c b/examples/pk.c
index 1385a0e..69450b1 100644
--- a/examples/pk.c
+++ b/examples/pk.c
@@ -307,10 +307,15 @@ const char dh_params_txt[] = "-----BEGIN DH PARAMETERS-----\n"\
static int test_ncr_dh(int cfd)
{
struct ncr_key_generate_st kgen;
-ncr_key_t private1, public1;
+ncr_key_t private1, public1, public2, private2;
+ncr_key_t z1, z2;
int ret;
gnutls_datum g, p, params;
gnutls_dh_params_t dhp;
+unsigned char y1[1024], y2[1024];
+size_t y1_size, y2_size;
+struct ncr_key_data_st keydata;
+struct ncr_key_derivation_params_st kderive;
fprintf(stdout, "Tests on DH key exchange:");
fflush(stdout);
@@ -367,6 +372,151 @@ gnutls_dh_params_t dhp;
perror("ioctl(NCRIO_KEY_GENERATE)");
return 1;
}
+
+ /* generate another DH key */
+ if (ioctl(cfd, NCRIO_KEY_INIT, &private2)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ if (ioctl(cfd, NCRIO_KEY_INIT, &public2)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ memset(&kgen, 0, sizeof(kgen));
+ kgen.desc = private2;
+ kgen.desc2 = public2;
+ kgen.params.algorithm = NCR_ALG_DH;
+ kgen.params.keyflags = NCR_KEY_FLAG_EXPORTABLE;
+ kgen.params.params.dh.p = p.data;
+ kgen.params.params.dh.p_size = p.size;
+ kgen.params.params.dh.g = g.data;
+ kgen.params.params.dh.g_size = g.size;
+
+ if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_GENERATE)");
+ return 1;
+ }
+
+ /* export y1=g^x1 */
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = public1;
+ keydata.idata = y1;
+ keydata.idata_size = sizeof(y1);
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_EXPORT)");
+ return 1;
+ }
+
+ y1_size = keydata.idata_size;
+
+ /* export y2=g^x2 */
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = public2;
+ keydata.idata = y2;
+ keydata.idata_size = sizeof(y2);
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_EXPORT)");
+ return 1;
+ }
+
+ y2_size = keydata.idata_size;
+
+ /* z1=y1^x2 */
+ if (ioctl(cfd, NCRIO_KEY_INIT, &z1)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ memset(&kderive, 0, sizeof(kderive));
+ kderive.derive = NCR_DERIVE_DH;
+ kderive.newkey = z1;
+ kderive.keyflags = NCR_KEY_FLAG_EXPORTABLE;
+ kderive.key = private1;
+ kderive.params.params.dh.pub = y2;
+ kderive.params.params.dh.pub_size = y2_size;
+
+ if (ioctl(cfd, NCRIO_KEY_DERIVE, &kderive)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ /* z2=y2^x1 */
+ if (ioctl(cfd, NCRIO_KEY_INIT, &z2)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ memset(&kderive, 0, sizeof(kderive));
+ kderive.derive = NCR_DERIVE_DH;
+ kderive.newkey = z2;
+ kderive.keyflags = NCR_KEY_FLAG_EXPORTABLE;
+ kderive.key = private2;
+ kderive.params.params.dh.pub = y1;
+ kderive.params.params.dh.pub_size = y1_size;
+
+ if (ioctl(cfd, NCRIO_KEY_DERIVE, &kderive)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_INIT)");
+ return 1;
+ }
+
+ /* z1==z2 */
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = z1;
+ keydata.idata = y1;
+ keydata.idata_size = sizeof(y1);
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_EXPORT)");
+ return 1;
+ }
+ y1_size = keydata.idata_size;
+
+ memset(&keydata, 0, sizeof(keydata));
+ keydata.key = z2;
+ keydata.idata = y2;
+ keydata.idata_size = sizeof(y2);
+
+ if (ioctl(cfd, NCRIO_KEY_EXPORT, &keydata)) {
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ perror("ioctl(NCRIO_KEY_EXPORT)");
+ return 1;
+ }
+ y2_size = keydata.idata_size;
+
+ if (y1_size == 0 || y1_size != y2_size || memcmp(y1, y2, y1_size) != 0) {
+ int i;
+
+ fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__);
+ fprintf(stderr, "Output in DH does not match (%d, %d)!\n",
+ (int)y1_size, (int)y2_size);
+
+ fprintf(stderr, "Key1[%d]: ", (int) y1_size);
+ for(i=0;i<y1_size;i++)
+ fprintf(stderr, "%.2x:", y1[i]);
+ fprintf(stderr, "\n");
+
+ fprintf(stderr, "Key2[%d]: ", (int) y2_size);
+ for(i=0;i<y2_size;i++)
+ fprintf(stderr, "%.2x:", y2[i]);
+ fprintf(stderr, "\n");
+
+ return 1;
+ }
+
fprintf(stdout, " Success\n");