diff options
Diffstat (limited to 'examples/pk.c')
| -rw-r--r-- | examples/pk.c | 1725 |
1 files changed, 0 insertions, 1725 deletions
diff --git a/examples/pk.c b/examples/pk.c deleted file mode 100644 index b2cae68..0000000 --- a/examples/pk.c +++ /dev/null @@ -1,1725 +0,0 @@ -/* - * Demo on how to use /dev/crypto device for HMAC. - * - * Placed under public domain. - * - */ -#include <assert.h> -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <time.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <linux/netlink.h> -#include "../ncr.h" -#include <stdlib.h> -#include <gnutls/gnutls.h> -#include <gnutls/x509.h> -#if GNUTLS_VERSION_NUMBER >= 0x020b00 -# include <gnutls/abstract.h> -#endif - -#define DATA_SIZE 4096 - -#define ALIGN_NL __attribute__((aligned(NLA_ALIGNTO))) - -#define SIGNATURE_HASH "sha1" -#define SIGNATURE_HASH_SIZE 20 - -#define ALG_AES_CBC "cbc(aes)" -#define ALG_DH "dh" -#define ALG_DSA "dsa" -#define ALG_RSA "rsa" - -static void print_hex_datum(gnutls_datum_t * dat) -{ - unsigned int j; -#define SPACE "\t" - fprintf(stdout, "\n" SPACE); - for (j = 0; j < dat->size; j++) { - fprintf(stdout, "%.2x:", (unsigned char)dat->data[j]); - if ((j + 1) % 15 == 0) - fprintf(stdout, "\n" SPACE); - } - fprintf(stdout, "\n"); -} - -static void -print_dsa_pkey(gnutls_datum_t * x, gnutls_datum_t * y, gnutls_datum_t * p, - gnutls_datum_t * q, gnutls_datum_t * g) -{ - if (x) { - fprintf(stdout, "private key:"); - print_hex_datum(x); - } - fprintf(stdout, "public key:"); - print_hex_datum(y); - fprintf(stdout, "p:"); - print_hex_datum(p); - fprintf(stdout, "q:"); - print_hex_datum(q); - fprintf(stdout, "g:"); - print_hex_datum(g); -} - -static void -print_rsa_pkey(gnutls_datum_t * m, gnutls_datum_t * e, gnutls_datum_t * d, - gnutls_datum_t * p, gnutls_datum_t * q, gnutls_datum_t * u, - gnutls_datum_t * exp1, gnutls_datum_t * exp2) -{ - fprintf(stdout, "modulus:"); - print_hex_datum(m); - fprintf(stdout, "public exponent:"); - print_hex_datum(e); - if (d) { - fprintf(stdout, "private exponent:"); - print_hex_datum(d); - fprintf(stdout, "prime1:"); - print_hex_datum(p); - fprintf(stdout, "prime2:"); - print_hex_datum(q); - fprintf(stdout, "coefficient:"); - print_hex_datum(u); - if (exp1 && exp2) { - fprintf(stdout, "exp1:"); - print_hex_datum(exp1); - fprintf(stdout, "exp2:"); - print_hex_datum(exp2); - } - } -} - -static const char *raw_to_string(const unsigned char *raw, size_t raw_size) -{ - static char buf[1024]; - size_t i; - if (raw_size == 0) - return NULL; - - if (raw_size * 3 + 1 >= sizeof(buf)) - return NULL; - - for (i = 0; i < raw_size; i++) { - sprintf(&(buf[i * 3]), "%02X%s", raw[i], - (i == raw_size - 1) ? "" : ":"); - } - buf[sizeof(buf) - 1] = '\0'; - - return buf; -} - -int privkey_info(void *data, int data_size, int verbose) -{ - gnutls_x509_privkey_t key; - size_t size; - int ret; - gnutls_datum_t der; - unsigned char buffer[5 * 1024]; - const char *cprint; - - ret = gnutls_x509_privkey_init(&key); - if (ret < 0) { - fprintf(stderr, "error in privkey_init\n"); - return 1; - } - - der.data = data; - der.size = data_size; - - ret = gnutls_x509_privkey_import(key, &der, GNUTLS_X509_FMT_DER); - if (ret < 0) { - fprintf(stderr, "unable to import privkey\n"); - return 1; - } - - if (verbose > 0) { - /* Public key algorithm - */ - fprintf(stdout, "Public Key Info:\n"); - ret = gnutls_x509_privkey_get_pk_algorithm(key); - - fprintf(stdout, "\tPublic Key Algorithm: "); - cprint = gnutls_pk_algorithm_get_name(ret); - fprintf(stdout, "%s\n", cprint ? cprint : "Unknown"); - - /* Print the raw public and private keys - */ - if (ret == GNUTLS_PK_RSA) { - gnutls_datum_t m, e, d, p, q, u, exp1 = { NULL, 0 } - , exp2 = { - NULL, 0}; - -#if GNUTLS_VERSION_NUMBER >= 0x020b00 - ret = - gnutls_x509_privkey_export_rsa_raw2(key, &m, &e, &d, - &p, &q, &u, - &exp1, &exp2); -#else - ret = - gnutls_x509_privkey_export_rsa_raw(key, &m, &e, &d, - &p, &q, &u); -#endif - if (ret < 0) - fprintf(stderr, - "Error in key RSA data export: %s\n", - gnutls_strerror(ret)); - else { - print_rsa_pkey(&m, &e, &d, &p, &q, &u, &exp1, - &exp2); - gnutls_free(m.data); - gnutls_free(e.data); - gnutls_free(d.data); - gnutls_free(p.data); - gnutls_free(q.data); - gnutls_free(u.data); - gnutls_free(exp1.data); - gnutls_free(exp2.data); - } - } else if (ret == GNUTLS_PK_DSA) { - gnutls_datum_t p, q, g, y, x; - - ret = - gnutls_x509_privkey_export_dsa_raw(key, &p, &q, &g, - &y, &x); - if (ret < 0) - fprintf(stderr, - "Error in key DSA data export: %s\n", - gnutls_strerror(ret)); - else { - print_dsa_pkey(&x, &y, &p, &q, &g); - gnutls_free(x.data); - gnutls_free(y.data); - gnutls_free(p.data); - gnutls_free(q.data); - gnutls_free(g.data); - } - } - - fprintf(stdout, "\n"); - - size = sizeof(buffer); - if ((ret = - gnutls_x509_privkey_get_key_id(key, 0, buffer, - &size)) < 0) { - fprintf(stderr, "Error in key id calculation: %s\n", - gnutls_strerror(ret)); - } else { - fprintf(stdout, "Public Key ID: %s\n", - raw_to_string(buffer, size)); - } - - size = sizeof(buffer); - ret = - gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, buffer, - &size); - if (ret < 0) { - fprintf(stderr, "Error in privkey_export\n"); - return 1; - } - - fprintf(stdout, "\n%s\n", buffer); - } - - gnutls_x509_privkey_deinit(key); - - return 0; -} - -int pubkey_info(void *data, int data_size, int verbose) -{ -#if GNUTLS_VERSION_NUMBER >= 0x020b00 - gnutls_pubkey_t key; - size_t size; - int ret; - gnutls_datum_t der; - unsigned char buffer[5 * 1024]; - const char *cprint; - - ret = gnutls_pubkey_init(&key); - if (ret < 0) { - fprintf(stderr, "error in pubkey_init\n"); - return 1; - } - - der.data = data; - der.size = data_size; - - ret = gnutls_pubkey_import(key, &der, GNUTLS_X509_FMT_DER); - if (ret < 0) { - fprintf(stderr, "unable to import pubkey\n"); - return 1; - } - - if (verbose > 0) { - /* Public key algorithm - */ - fprintf(stdout, "Public Key Info:\n"); - ret = gnutls_pubkey_get_pk_algorithm(key, NULL); - - fprintf(stdout, "\tPublic Key Algorithm: "); - cprint = gnutls_pk_algorithm_get_name(ret); - fprintf(stdout, "%s\n", cprint ? cprint : "Unknown"); - - /* Print the raw public and private keys - */ - if (ret == GNUTLS_PK_RSA) { - gnutls_datum_t m, e; - - ret = gnutls_pubkey_get_pk_rsa_raw(key, &m, &e); - if (ret < 0) - fprintf(stderr, - "Error in key RSA data export: %s\n", - gnutls_strerror(ret)); - else { - print_rsa_pkey(&m, &e, NULL, NULL, NULL, NULL, - NULL, NULL); - gnutls_free(m.data); - gnutls_free(e.data); - } - } else if (ret == GNUTLS_PK_DSA) { - gnutls_datum_t p, q, g, y; - - ret = gnutls_pubkey_get_pk_dsa_raw(key, &p, &q, &g, &y); - if (ret < 0) - fprintf(stderr, - "Error in key DSA data export: %s\n", - gnutls_strerror(ret)); - else { - print_dsa_pkey(NULL, &y, &p, &q, &g); - gnutls_free(y.data); - gnutls_free(p.data); - gnutls_free(q.data); - gnutls_free(g.data); - } - } - - fprintf(stdout, "\n"); - - size = sizeof(buffer); - if ((ret = gnutls_pubkey_get_key_id(key, 0, buffer, &size)) < 0) { - fprintf(stderr, "Error in key id calculation: %s\n", - gnutls_strerror(ret)); - } else { - fprintf(stdout, "Public Key ID: %s\n", - raw_to_string(buffer, size)); - } - - size = sizeof(buffer); - ret = - gnutls_pubkey_export(key, GNUTLS_X509_FMT_PEM, buffer, - &size); - if (ret < 0) { - fprintf(stderr, "Error in privkey_export\n"); - return 1; - } - - fprintf(stdout, "\n%s\n", buffer); - } - - gnutls_pubkey_deinit(key); -#endif - return 0; -} - -/* Diffie Hellman */ -const char dh_params_txt[] = "-----BEGIN DH PARAMETERS-----\n" - "MIGHAoGBAKMox0/IjuGqSaGMJESYMhdmXiTe1pY8gkSzWZ/ktWaUdaYAzgAZp7r3\n" - "OCh68YslS9Oi7/UQjmBbgGuOucMKgq3tYeYzY8G2epIuIzM4TAogaEqwkdSrXlth\n" - "MMsP2FhLhHg8m6V6iItitnMOz9r8t3BEf04GRlfzgZraM0gUUwTjAgEF\n" - "-----END DH PARAMETERS-----\n"; - -static int test_ncr_dh(int cfd) -{ - struct __attribute__ ((packed)) { - struct ncr_key_generate_pair f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_DH)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - unsigned char buffer[DATA_SIZE] ALIGN_NL; - } kgen; - struct nlattr *nla; - ncr_key_t private1, public1, public2, private2; - ncr_key_t z1, z2; - int ret, j; - gnutls_datum g, p, params; - gnutls_dh_params_t dhp; - unsigned char y1[1024], y2[1024]; - ssize_t y1_size, y2_size; - struct ncr_key_export kexport; - struct __attribute__ ((packed)) { - struct ncr_key_derive f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_DERIVE_DH)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - struct nlattr public_head ALIGN_NL; - unsigned char public[DATA_SIZE] ALIGN_NL; - } kderive; - - fprintf(stdout, "Tests on DH key exchange:"); - fflush(stdout); - - params.data = (void *)dh_params_txt; - params.size = sizeof(dh_params_txt) - 1; - - ret = gnutls_dh_params_init(&dhp); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - fprintf(stderr, "gnutls: %s\n", gnutls_strerror(ret)); - return 1; - } - - ret = gnutls_dh_params_import_pkcs3(dhp, ¶ms, GNUTLS_X509_FMT_PEM); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - fprintf(stderr, "gnutls: %s\n", gnutls_strerror(ret)); - return 1; - } - - ret = gnutls_dh_params_export_raw(dhp, &p, &g, NULL); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - fprintf(stderr, "gnutls: %s\n", gnutls_strerror(ret)); - return 1; - } - - for (j = 0; j < 100; j++) { - /* generate a DH key */ - private1 = ioctl(cfd, NCRIO_KEY_INIT); - if (private1 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - public1 = ioctl(cfd, NCRIO_KEY_INIT); - if (public1 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kgen.f, 0, sizeof(kgen.f)); - kgen.f.private_key = private1; - kgen.f.public_key = public1; - kgen.algo_head.nla_len = NLA_HDRLEN + sizeof(kgen.algo); - kgen.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kgen.algo, ALG_DH); - kgen.flags_head.nla_len = NLA_HDRLEN + sizeof(kgen.flags); - kgen.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kgen.flags = NCR_KEY_FLAG_EXPORTABLE; - nla = (struct nlattr *)kgen.buffer; - nla->nla_len = NLA_HDRLEN + p.size; - nla->nla_type = NCR_ATTR_DH_PRIME; - memcpy((char *)nla + NLA_HDRLEN, p.data, p.size); - nla = (struct nlattr *)((char *)nla + NLA_ALIGN(nla->nla_len)); - nla->nla_len = NLA_HDRLEN + g.size; - nla->nla_type = NCR_ATTR_DH_BASE; - memcpy((char *)nla + NLA_HDRLEN, g.data, g.size); - nla = (struct nlattr *)((char *)nla + NLA_ALIGN(nla->nla_len)); - kgen.f.input_size = (char *)nla - (char *)&kgen; - assert(kgen.f.input_size <= sizeof(kgen)); - - if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_GENERATE_PAIR)"); - return 1; - } - - /* generate another DH key */ - private2 = ioctl(cfd, NCRIO_KEY_INIT); - if (private2 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - public2 = ioctl(cfd, NCRIO_KEY_INIT); - if (public2 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kgen.f, 0, sizeof(kgen.f)); - kgen.f.private_key = private2; - kgen.f.public_key = public2; - kgen.algo_head.nla_len = NLA_HDRLEN + sizeof(kgen.algo); - kgen.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kgen.algo, ALG_DH); - kgen.flags_head.nla_len = NLA_HDRLEN + sizeof(kgen.flags); - kgen.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kgen.flags = NCR_KEY_FLAG_EXPORTABLE; - nla = (struct nlattr *)kgen.buffer; - nla->nla_len = NLA_HDRLEN + p.size; - nla->nla_type = NCR_ATTR_DH_PRIME; - memcpy((char *)nla + NLA_HDRLEN, p.data, p.size); - nla = (struct nlattr *)((char *)nla + NLA_ALIGN(nla->nla_len)); - nla->nla_len = NLA_HDRLEN + g.size; - nla->nla_type = NCR_ATTR_DH_BASE; - memcpy((char *)nla + NLA_HDRLEN, g.data, g.size); - nla = (struct nlattr *)((char *)nla + NLA_ALIGN(nla->nla_len)); - kgen.f.input_size = (char *)nla - (char *)&kgen; - assert(kgen.f.input_size <= sizeof(kgen)); - - if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_GENERATE_PAIR)"); - return 1; - } - - /* export y1=g^x1 */ - memset(&kexport, 0, sizeof(kexport)); - kexport.key = public1; - kexport.buffer = y1; - kexport.buffer_size = sizeof(y1); - - y1_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (y1_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - /* export y2=g^x2 */ - memset(&kexport, 0, sizeof(kexport)); - kexport.key = public2; - kexport.buffer = y2; - kexport.buffer_size = sizeof(y2); - - y2_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (y2_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - /* z1=y1^x2 */ - z1 = ioctl(cfd, NCRIO_KEY_INIT); - if (z1 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kderive.f, 0, sizeof(kderive.f)); - kderive.f.input_key = private1; - kderive.f.new_key = z1; - kderive.algo_head.nla_len = NLA_HDRLEN + sizeof(kderive.algo); - kderive.algo_head.nla_type = NCR_ATTR_DERIVATION_ALGORITHM; - strcpy(kderive.algo, NCR_DERIVE_DH); - kderive.flags_head.nla_len = NLA_HDRLEN + sizeof(kderive.flags); - kderive.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kderive.flags = NCR_KEY_FLAG_EXPORTABLE; - kderive.public_head.nla_len = NLA_HDRLEN + y2_size; - kderive.public_head.nla_type = NCR_ATTR_DH_PUBLIC; - memcpy(kderive.public, y2, y2_size); - nla = (struct nlattr *)((char *)&kderive.public_head - + - NLA_ALIGN(kderive.public_head.nla_len)); - kderive.f.input_size = (char *)nla - (char *)&kderive; - assert(kderive.f.input_size <= sizeof(kderive)); - - if (ioctl(cfd, NCRIO_KEY_DERIVE, &kderive)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_DERIVE)"); - return 1; - } - - /* z2=y2^x1 */ - z2 = ioctl(cfd, NCRIO_KEY_INIT); - if (z2 == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kderive.f, 0, sizeof(kderive.f)); - kderive.f.input_key = private2; - kderive.f.new_key = z2; - kderive.algo_head.nla_len = NLA_HDRLEN + sizeof(kderive.algo); - kderive.algo_head.nla_type = NCR_ATTR_DERIVATION_ALGORITHM; - strcpy(kderive.algo, NCR_DERIVE_DH); - kderive.flags_head.nla_len = NLA_HDRLEN + sizeof(kderive.flags); - kderive.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kderive.flags = NCR_KEY_FLAG_EXPORTABLE; - kderive.public_head.nla_len = NLA_HDRLEN + y1_size; - kderive.public_head.nla_type = NCR_ATTR_DH_PUBLIC; - memcpy(kderive.public, y1, y1_size); - nla = (struct nlattr *)((char *)&kderive.public_head - + - NLA_ALIGN(kderive.public_head.nla_len)); - kderive.f.input_size = (char *)nla - (char *)&kderive; - assert(kderive.f.input_size <= sizeof(kderive)); - - if (ioctl(cfd, NCRIO_KEY_DERIVE, &kderive)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_DERIVE)"); - return 1; - } - - /* z1==z2 */ - memset(&kexport, 0, sizeof(kexport)); - kexport.key = z1; - kexport.buffer = y1; - kexport.buffer_size = sizeof(y1); - - y1_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (y1_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - memset(&kexport, 0, sizeof(kexport)); - kexport.key = z2; - kexport.buffer = y2; - kexport.buffer_size = sizeof(y2); - - y2_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (y2_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - 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; - } - - if (ioctl(cfd, NCRIO_KEY_DEINIT, &private1)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - if (ioctl(cfd, NCRIO_KEY_DEINIT, &public1)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - if (ioctl(cfd, NCRIO_KEY_DEINIT, &private2)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - if (ioctl(cfd, NCRIO_KEY_DEINIT, &public2)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - if (ioctl(cfd, NCRIO_KEY_DEINIT, &z1)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - if (ioctl(cfd, NCRIO_KEY_DEINIT, &z2)) { - perror("ioctl(NCRIO_KEY_DEINIT)"); - return 1; - } - } - - fprintf(stdout, " Success\n"); - - return 0; -} - -/* check whether wrapping of long keys is not allowed with - * shorted wrapping keys */ -static int test_ncr_wrap_key3(int cfd) -{ - int ret, i; - ncr_key_t key; - size_t data_size; - struct __attribute__ ((packed)) { - struct ncr_key_import f; - struct nlattr id_head ALIGN_NL; - uint8_t id[2] ALIGN_NL; - struct nlattr type_head ALIGN_NL; - uint32_t type ALIGN_NL; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_AES_CBC)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - } kimport; - struct __attribute__ ((packed)) { - struct ncr_key_wrap f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_WALG_AES_RFC5649)] ALIGN_NL; - } - kwrap; - struct __attribute__ ((packed)) { - struct ncr_key_unwrap f; - struct nlattr wrap_algo_head ALIGN_NL; - char wrap_algo[sizeof(NCR_WALG_AES_RFC5649)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - } kunwrap; - struct __attribute__ ((packed)) { - struct ncr_key_generate_pair f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_RSA)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - struct nlattr bits_head ALIGN_NL; - uint32_t bits ALIGN_NL; - } kgen; - ncr_key_t pubkey, privkey; - uint8_t data[DATA_SIZE]; - /* only the first two should be allowed to be wrapped. - * the latter shouldn't because it has security level larger - * then 128 bits (the size of the wrapping key). - */ - const int sizes[] = { 1024, 3248, 5200 }; - - fprintf(stdout, "Tests on key wrapping (might take long): "); - fflush(stdout); - - /* convert it to key */ - privkey = ioctl(cfd, NCRIO_KEY_INIT); - if (privkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - pubkey = ioctl(cfd, NCRIO_KEY_INIT); - if (pubkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - if (geteuid() != 0) { - /* cannot test further */ - fprintf(stdout, - "\t(Wrapping test not completed. Run as root)\n"); - return 0; - } - - /* make a wrapping key */ - key = ioctl(cfd, NCRIO_KEY_INIT); - if (key == -1) { - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kimport.f, 0, sizeof(kimport.f)); - kimport.f.input_size = sizeof(kimport); - kimport.f.key = key; - kimport.f.data = - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"; - kimport.f.data_size = 16; - kimport.id_head.nla_len = NLA_HDRLEN + sizeof(kimport.id); - kimport.id_head.nla_type = NCR_ATTR_KEY_ID; - kimport.id[0] = 'a'; - kimport.id[1] = 'b'; - kimport.type_head.nla_len = NLA_HDRLEN + sizeof(kimport.type); - kimport.type_head.nla_type = NCR_ATTR_KEY_TYPE; - kimport.type = NCR_KEY_TYPE_SECRET; - kimport.algo_head.nla_len = NLA_HDRLEN + sizeof(kimport.algo); - kimport.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kimport.algo, ALG_AES_CBC); - kimport.flags_head.nla_len = NLA_HDRLEN + sizeof(kimport.flags); - kimport.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kimport.flags = - NCR_KEY_FLAG_EXPORTABLE | NCR_KEY_FLAG_WRAPPING | - NCR_KEY_FLAG_UNWRAPPING; - - if (ioctl(cfd, NCRIO_KEY_IMPORT, &kimport)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_IMPORT)"); - return 1; - } - - for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) { - - fprintf(stdout, "."); - fflush(stdout); - - memset(&kgen.f, 0, sizeof(kgen.f)); - kgen.f.input_size = sizeof(kgen); - kgen.f.private_key = privkey; - kgen.f.public_key = pubkey; - kgen.algo_head.nla_len = NLA_HDRLEN + sizeof(kgen.algo); - kgen.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kgen.algo, ALG_RSA); - kgen.flags_head.nla_len = NLA_HDRLEN + sizeof(kgen.flags); - kgen.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kgen.flags = NCR_KEY_FLAG_EXPORTABLE | NCR_KEY_FLAG_WRAPPABLE; - kgen.bits_head.nla_len = NLA_HDRLEN + sizeof(kgen.bits); - kgen.bits_head.nla_type = NCR_ATTR_RSA_MODULUS_BITS; - kgen.bits = sizes[i]; - - if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) { - fprintf(stderr, "Error[%d-%d]: %s:%d\n", i, sizes[i], - __func__, __LINE__); - perror("ioctl(NCRIO_KEY_GENERATE_PAIR)"); - return 1; - } - - /* now try wrapping key2 using key */ - memset(&kwrap.f, 0, sizeof(kwrap.f)); - kwrap.f.input_size = sizeof(kwrap); - kwrap.f.wrapping_key = key; - kwrap.f.source_key = pubkey; - kwrap.f.buffer = data; - kwrap.f.buffer_size = sizeof(data); - kwrap.algo_head.nla_len = NLA_HDRLEN + sizeof(kwrap.algo); - kwrap.algo_head.nla_type = NCR_ATTR_WRAPPING_ALGORITHM; - strcpy(kwrap.algo, NCR_WALG_AES_RFC5649); - - ret = ioctl(cfd, NCRIO_KEY_WRAP, &kwrap); - if (ret < 0) { - fprintf(stderr, "Error[%d-%d]: %s:%d\n", i, sizes[i], - __func__, __LINE__); - /* wrapping of public key should have been allowed! */ - return 1; - } - - /* now try wrapping private using key */ - memset(&kwrap.f, 0, sizeof(kwrap.f)); - kwrap.f.input_size = sizeof(kwrap); - kwrap.f.wrapping_key = key; - kwrap.f.source_key = privkey; - kwrap.f.buffer = data; - kwrap.f.buffer_size = sizeof(data); - kwrap.algo_head.nla_len = NLA_HDRLEN + sizeof(kwrap.algo); - kwrap.algo_head.nla_type = NCR_ATTR_WRAPPING_ALGORITHM; - strcpy(kwrap.algo, NCR_WALG_AES_RFC5649); - - ret = ioctl(cfd, NCRIO_KEY_WRAP, &kwrap); - if (ret < 0 && i != 2) { - fprintf(stderr, "Error[%d-%d]: %s:%d\n", i, sizes[i], - __func__, __LINE__); - /* wrapping should have been allowed */ - return 1; - } else if (ret >= 0 && i == 2) { - fprintf(stderr, "Error[%d-%d]: %s:%d\n", i, sizes[i], - __func__, __LINE__); - /* wrapping shouldn't have been allowed */ - return 1; - } - - if (ret >= 0) { - data_size = ret; - - /* try unwrapping */ - memset(&kunwrap.f, 0, sizeof(kunwrap.f)); - kunwrap.f.input_size = sizeof(kunwrap); - kunwrap.f.wrapping_key = key; - kunwrap.f.dest_key = privkey; - kunwrap.f.data = data; - kunwrap.f.data_size = data_size; - kunwrap.wrap_algo_head.nla_len - = NLA_HDRLEN + sizeof(kunwrap.wrap_algo); - kunwrap.wrap_algo_head.nla_type - = NCR_ATTR_WRAPPING_ALGORITHM; - strcpy(kunwrap.wrap_algo, NCR_WALG_AES_RFC5649); - kunwrap.flags_head.nla_len - = NLA_HDRLEN + sizeof(kunwrap.flags); - kunwrap.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kunwrap.flags = 0; - - ret = ioctl(cfd, NCRIO_KEY_UNWRAP, &kunwrap); - if (ret) { - fprintf(stderr, "Error[%d-%d]: %s:%d\n", i, - sizes[i], __func__, __LINE__); - return 1; - } - } - fprintf(stdout, "*"); - fflush(stdout); - - } - - fprintf(stdout, " Success\n"); - return 0; -} - -#define RSA_ENCRYPT_SIZE 32 - -static int rsa_key_encrypt(int cfd, ncr_key_t privkey, ncr_key_t pubkey, - int oaep) -{ - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_RSA)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr rsa_head ALIGN_NL; - uint32_t rsa ALIGN_NL; - struct nlattr oaep_hash_head ALIGN_NL; - char oaep_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr output_head ALIGN_NL; - struct ncr_session_output_buffer output ALIGN_NL; - } op; - uint8_t data[DATA_SIZE]; - uint8_t vdata[RSA_ENCRYPT_SIZE]; - size_t enc_size, dec_size; - - fprintf(stdout, "Tests on RSA (%s) key encryption:", - (oaep != 0) ? "OAEP" : "PKCS V1.5"); - fflush(stdout); - - memset(data, 0x3, sizeof(data)); - memcpy(vdata, data, sizeof(vdata)); - - /* do encryption */ - memset(&op.f, 0, sizeof(op.f)); - op.f.input_size = sizeof(op); - op.f.op = NCR_OP_ENCRYPT; - op.algo_head.nla_len = NLA_HDRLEN + sizeof(op.algo); - op.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(op.algo, ALG_RSA); - op.key_head.nla_len = NLA_HDRLEN + sizeof(op.key); - op.key_head.nla_type = NCR_ATTR_KEY; - op.key = pubkey; - op.rsa_head.nla_len = NLA_HDRLEN + sizeof(op.rsa); - op.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - if (oaep) { - op.rsa = RSA_PKCS1_OAEP; - } else { - op.rsa = RSA_PKCS1_V1_5; - } - op.oaep_hash_head.nla_len = NLA_HDRLEN + sizeof(op.oaep_hash); - op.oaep_hash_head.nla_type = NCR_ATTR_RSA_OAEP_HASH_ALGORITHM; - strcpy(op.oaep_hash, SIGNATURE_HASH); /* Ignored if not using OAEP */ - op.input_head.nla_len = NLA_HDRLEN + sizeof(op.input); - op.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - op.input.data = data; - op.input.data_size = RSA_ENCRYPT_SIZE; - op.output_head.nla_len = NLA_HDRLEN + sizeof(op.output); - op.output_head.nla_type = NCR_ATTR_UPDATE_OUTPUT_BUFFER; - op.output.buffer = data; - op.output.buffer_size = sizeof(data); - op.output.result_size_ptr = &enc_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &op)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - /* decrypt data */ - memset(&op.f, 0, sizeof(op.f)); - op.f.input_size = sizeof(op); - op.f.op = NCR_OP_DECRYPT; - op.algo_head.nla_len = NLA_HDRLEN + sizeof(op.algo); - op.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(op.algo, ALG_RSA); - op.key_head.nla_len = NLA_HDRLEN + sizeof(op.key); - op.key_head.nla_type = NCR_ATTR_KEY; - op.key = privkey; - op.rsa_head.nla_len = NLA_HDRLEN + sizeof(op.rsa); - op.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - if (oaep) { - op.rsa = RSA_PKCS1_OAEP; - } else { - op.rsa = RSA_PKCS1_V1_5; - } - op.oaep_hash_head.nla_len = NLA_HDRLEN + sizeof(op.oaep_hash); - op.oaep_hash_head.nla_type = NCR_ATTR_RSA_OAEP_HASH_ALGORITHM; - strcpy(op.oaep_hash, SIGNATURE_HASH); /* Ignored if not using OAEP */ - op.input_head.nla_len = NLA_HDRLEN + sizeof(op.input); - op.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - op.input.data = data; - op.input.data_size = enc_size; - op.output_head.nla_len = NLA_HDRLEN + sizeof(op.output); - op.output_head.nla_type = NCR_ATTR_UPDATE_OUTPUT_BUFFER; - op.output.buffer = data; - op.output.buffer_size = sizeof(data); - op.output.result_size_ptr = &dec_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &op)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - if (dec_size != sizeof(vdata) - || memcmp(vdata, data, sizeof(vdata)) != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - fprintf(stderr, "Decrypted data do not match!\n"); - return 1; - } - - fprintf(stdout, " Success\n"); - - return 0; - -} - -#define DATA_TO_SIGN 52 - -static int rsa_key_sign_verify(int cfd, ncr_key_t privkey, ncr_key_t pubkey, - int pss) -{ - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_RSA)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr rsa_head ALIGN_NL; - uint32_t rsa ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_output_buffer signature ALIGN_NL; - } ksign; - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_RSA)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr rsa_head ALIGN_NL; - uint32_t rsa ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_input_data signature ALIGN_NL; - } kverify; - uint8_t data[DATA_SIZE]; - uint8_t sig[DATA_SIZE]; - size_t sig_size; - int ret; - - fprintf(stdout, "Tests on RSA (%s) key signature:", - (pss != 0) ? "PSS" : "PKCS V1.5"); - fflush(stdout); - - memset(data, 0x3, sizeof(data)); - - /* sign data */ - memset(&ksign.f, 0, sizeof(ksign.f)); - ksign.f.input_size = sizeof(ksign); - ksign.f.op = NCR_OP_SIGN; - ksign.algo_head.nla_len = NLA_HDRLEN + sizeof(ksign.algo); - ksign.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(ksign.algo, ALG_RSA); - ksign.key_head.nla_len = NLA_HDRLEN + sizeof(ksign.key); - ksign.key_head.nla_type = NCR_ATTR_KEY; - ksign.key = privkey; - ksign.rsa_head.nla_len = NLA_HDRLEN + sizeof(ksign.rsa); - ksign.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - ksign.rsa = (pss != 0) ? RSA_PKCS1_PSS : RSA_PKCS1_V1_5; - ksign.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(ksign.sign_hash); - ksign.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(ksign.sign_hash, SIGNATURE_HASH); - ksign.input_head.nla_len = NLA_HDRLEN + sizeof(ksign.input); - ksign.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - ksign.input.data = data; - ksign.input.data_size = DATA_TO_SIGN; - ksign.signature_head.nla_len = NLA_HDRLEN + sizeof(ksign.signature); - ksign.signature_head.nla_type = NCR_ATTR_FINAL_OUTPUT_BUFFER; - ksign.signature.buffer = sig; - ksign.signature.buffer_size = sizeof(sig); - ksign.signature.result_size_ptr = &sig_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &ksign)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - /* verify signature */ - memset(data, 0x3, sizeof(data)); - - memset(&kverify.f, 0, sizeof(kverify.f)); - kverify.f.input_size = sizeof(kverify); - kverify.f.op = NCR_OP_VERIFY; - kverify.algo_head.nla_len = NLA_HDRLEN + sizeof(kverify.algo); - kverify.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kverify.algo, ALG_RSA); - kverify.key_head.nla_len = NLA_HDRLEN + sizeof(kverify.key); - kverify.key_head.nla_type = NCR_ATTR_KEY; - kverify.key = pubkey; - kverify.rsa_head.nla_len = NLA_HDRLEN + sizeof(kverify.rsa); - kverify.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - kverify.rsa = (pss != 0) ? RSA_PKCS1_PSS : RSA_PKCS1_V1_5; - kverify.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(kverify.sign_hash); - kverify.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(kverify.sign_hash, SIGNATURE_HASH); - kverify.input_head.nla_len = NLA_HDRLEN + sizeof(kverify.input); - kverify.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - kverify.input.data = data; - kverify.input.data_size = DATA_TO_SIGN; - kverify.signature_head.nla_len = NLA_HDRLEN + sizeof(kverify.signature); - kverify.signature_head.nla_type = NCR_ATTR_FINAL_INPUT_DATA; - kverify.signature.data = sig; - kverify.signature.data_size = sig_size; - - ret = ioctl(cfd, NCRIO_SESSION_ONCE, &kverify); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - if (ret) - fprintf(stdout, " Success\n"); - else { - fprintf(stdout, " Verification Failed!\n"); - return 1; - } - - return 0; - -} - -static int rsa_key_sign_verify_transparent(int cfd, ncr_key_t privkey, - ncr_key_t pubkey, int pss) -{ - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_ALG_RSA_TRANSPARENT_HASH)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr rsa_head ALIGN_NL; - uint32_t rsa ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_output_buffer signature ALIGN_NL; - } ksign; - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_ALG_RSA_TRANSPARENT_HASH)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr rsa_head ALIGN_NL; - uint32_t rsa ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_input_data signature ALIGN_NL; - } kverify; - uint8_t data[SIGNATURE_HASH_SIZE]; - uint8_t sig[DATA_SIZE]; - size_t sig_size; - int ret; - - fprintf(stdout, "Tests on transparent RSA (%s) key signature:", - (pss != 0) ? "PSS" : "PKCS V1.5"); - fflush(stdout); - - memset(data, 0x3, sizeof(data)); - - /* sign data */ - memset(&ksign.f, 0, sizeof(ksign.f)); - ksign.f.input_size = sizeof(ksign); - ksign.f.op = NCR_OP_SIGN; - ksign.algo_head.nla_len = NLA_HDRLEN + sizeof(ksign.algo); - ksign.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(ksign.algo, NCR_ALG_RSA_TRANSPARENT_HASH); - ksign.key_head.nla_len = NLA_HDRLEN + sizeof(ksign.key); - ksign.key_head.nla_type = NCR_ATTR_KEY; - ksign.key = privkey; - ksign.rsa_head.nla_len = NLA_HDRLEN + sizeof(ksign.rsa); - ksign.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - ksign.rsa = (pss != 0) ? RSA_PKCS1_PSS : RSA_PKCS1_V1_5; - ksign.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(ksign.sign_hash); - ksign.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(ksign.sign_hash, SIGNATURE_HASH); - ksign.input_head.nla_len = NLA_HDRLEN + sizeof(ksign.input); - ksign.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - ksign.input.data = data; - ksign.input.data_size = SIGNATURE_HASH_SIZE; - ksign.signature_head.nla_len = NLA_HDRLEN + sizeof(ksign.signature); - ksign.signature_head.nla_type = NCR_ATTR_FINAL_OUTPUT_BUFFER; - ksign.signature.buffer = sig; - ksign.signature.buffer_size = sizeof(sig); - ksign.signature.result_size_ptr = &sig_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &ksign)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - /* verify signature */ - memset(data, 0x3, sizeof(data)); - - memset(&kverify.f, 0, sizeof(kverify.f)); - kverify.f.input_size = sizeof(kverify); - kverify.f.op = NCR_OP_VERIFY; - kverify.algo_head.nla_len = NLA_HDRLEN + sizeof(kverify.algo); - kverify.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kverify.algo, NCR_ALG_RSA_TRANSPARENT_HASH); - kverify.key_head.nla_len = NLA_HDRLEN + sizeof(kverify.key); - kverify.key_head.nla_type = NCR_ATTR_KEY; - kverify.key = pubkey; - kverify.rsa_head.nla_len = NLA_HDRLEN + sizeof(kverify.rsa); - kverify.rsa_head.nla_type = NCR_ATTR_RSA_ENCODING_METHOD; - kverify.rsa = (pss != 0) ? RSA_PKCS1_PSS : RSA_PKCS1_V1_5; - kverify.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(kverify.sign_hash); - kverify.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(kverify.sign_hash, SIGNATURE_HASH); - kverify.input_head.nla_len = NLA_HDRLEN + sizeof(kverify.input); - kverify.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - kverify.input.data = data; - kverify.input.data_size = SIGNATURE_HASH_SIZE; - kverify.signature_head.nla_len = NLA_HDRLEN + sizeof(kverify.signature); - kverify.signature_head.nla_type = NCR_ATTR_FINAL_INPUT_DATA; - kverify.signature.data = sig; - kverify.signature.data_size = sig_size; - - ret = ioctl(cfd, NCRIO_SESSION_ONCE, &kverify); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - if (ret) - fprintf(stdout, " Success\n"); - else { - fprintf(stdout, " Verification Failed!\n"); - return 1; - } - - return 0; -} - -static int dsa_key_sign_verify(int cfd, ncr_key_t privkey, ncr_key_t pubkey) -{ - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_DSA)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_output_buffer signature ALIGN_NL; - } ksign; - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_DSA)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_input_data signature ALIGN_NL; - } kverify; - uint8_t data[DATA_SIZE]; - uint8_t sig[DATA_SIZE]; - size_t sig_size; - int ret; - - fprintf(stdout, "Tests on DSA key signature:"); - fflush(stdout); - - memset(data, 0x3, sizeof(data)); - - /* sign data */ - memset(&ksign.f, 0, sizeof(ksign.f)); - ksign.f.input_size = sizeof(ksign); - ksign.f.op = NCR_OP_SIGN; - ksign.algo_head.nla_len = NLA_HDRLEN + sizeof(ksign.algo); - ksign.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(ksign.algo, ALG_DSA); - ksign.key_head.nla_len = NLA_HDRLEN + sizeof(ksign.key); - ksign.key_head.nla_type = NCR_ATTR_KEY; - ksign.key = privkey; - ksign.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(ksign.sign_hash); - ksign.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(ksign.sign_hash, SIGNATURE_HASH); - ksign.input_head.nla_len = NLA_HDRLEN + sizeof(ksign.input); - ksign.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - ksign.input.data = data; - ksign.input.data_size = DATA_TO_SIGN; - ksign.signature_head.nla_len = NLA_HDRLEN + sizeof(ksign.signature); - ksign.signature_head.nla_type = NCR_ATTR_FINAL_OUTPUT_BUFFER; - ksign.signature.buffer = sig; - ksign.signature.buffer_size = sizeof(sig); - ksign.signature.result_size_ptr = &sig_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &ksign)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - /* verify signature */ - memset(&kverify.f, 0, sizeof(kverify.f)); - kverify.f.input_size = sizeof(kverify); - kverify.f.op = NCR_OP_VERIFY; - kverify.algo_head.nla_len = NLA_HDRLEN + sizeof(kverify.algo); - kverify.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kverify.algo, ALG_DSA); - kverify.key_head.nla_len = NLA_HDRLEN + sizeof(kverify.key); - kverify.key_head.nla_type = NCR_ATTR_KEY; - kverify.key = pubkey; - kverify.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(kverify.sign_hash); - kverify.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(kverify.sign_hash, SIGNATURE_HASH); - kverify.input_head.nla_len = NLA_HDRLEN + sizeof(kverify.input); - kverify.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - kverify.input.data = data; - kverify.input.data_size = DATA_TO_SIGN; - kverify.signature_head.nla_len = NLA_HDRLEN + sizeof(kverify.signature); - kverify.signature_head.nla_type = NCR_ATTR_FINAL_INPUT_DATA; - kverify.signature.data = sig; - kverify.signature.data_size = sizeof(sig); - - ret = ioctl(cfd, NCRIO_SESSION_ONCE, &kverify); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - if (ret) - fprintf(stdout, " Success\n"); - else { - fprintf(stdout, " Verification Failed!\n"); - return 1; - } - - return 0; - -} - -static int dsa_key_sign_verify_transparent(int cfd, ncr_key_t privkey, - ncr_key_t pubkey) -{ - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_ALG_DSA_TRANSPARENT_HASH)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_output_buffer signature ALIGN_NL; - } ksign; - struct __attribute__ ((packed)) { - struct ncr_session_once f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(NCR_ALG_DSA_TRANSPARENT_HASH)] ALIGN_NL; - struct nlattr key_head ALIGN_NL; - uint32_t key ALIGN_NL; - struct nlattr sign_hash_head ALIGN_NL; - char sign_hash[sizeof(SIGNATURE_HASH)] ALIGN_NL; - struct nlattr input_head ALIGN_NL; - struct ncr_session_input_data input ALIGN_NL; - struct nlattr signature_head ALIGN_NL; - struct ncr_session_input_data signature ALIGN_NL; - } kverify; - uint8_t data[SIGNATURE_HASH_SIZE]; - uint8_t sig[DATA_SIZE]; - size_t sig_size; - int ret; - - fprintf(stdout, "Tests on transparent DSA key signature:"); - fflush(stdout); - - memset(data, 0x3, sizeof(data)); - - /* sign data */ - memset(&ksign.f, 0, sizeof(ksign.f)); - ksign.f.input_size = sizeof(ksign); - ksign.f.op = NCR_OP_SIGN; - ksign.algo_head.nla_len = NLA_HDRLEN + sizeof(ksign.algo); - ksign.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(ksign.algo, NCR_ALG_DSA_TRANSPARENT_HASH); - ksign.key_head.nla_len = NLA_HDRLEN + sizeof(ksign.key); - ksign.key_head.nla_type = NCR_ATTR_KEY; - ksign.key = privkey; - ksign.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(ksign.sign_hash); - ksign.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(ksign.sign_hash, SIGNATURE_HASH); - ksign.input_head.nla_len = NLA_HDRLEN + sizeof(ksign.input); - ksign.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - ksign.input.data = data; - ksign.input.data_size = SIGNATURE_HASH_SIZE; - ksign.signature_head.nla_len = NLA_HDRLEN + sizeof(ksign.signature); - ksign.signature_head.nla_type = NCR_ATTR_FINAL_OUTPUT_BUFFER; - ksign.signature.buffer = sig; - ksign.signature.buffer_size = sizeof(sig); - ksign.signature.result_size_ptr = &sig_size; - - if (ioctl(cfd, NCRIO_SESSION_ONCE, &ksign)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - /* verify signature */ - memset(&kverify.f, 0, sizeof(kverify.f)); - kverify.f.input_size = sizeof(kverify); - kverify.f.op = NCR_OP_VERIFY; - kverify.algo_head.nla_len = NLA_HDRLEN + sizeof(kverify.algo); - kverify.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kverify.algo, NCR_ALG_DSA_TRANSPARENT_HASH); - kverify.key_head.nla_len = NLA_HDRLEN + sizeof(kverify.key); - kverify.key_head.nla_type = NCR_ATTR_KEY; - kverify.key = pubkey; - kverify.sign_hash_head.nla_len = NLA_HDRLEN + sizeof(kverify.sign_hash); - kverify.sign_hash_head.nla_type = NCR_ATTR_SIGNATURE_HASH_ALGORITHM; - strcpy(kverify.sign_hash, SIGNATURE_HASH); - kverify.input_head.nla_len = NLA_HDRLEN + sizeof(kverify.input); - kverify.input_head.nla_type = NCR_ATTR_UPDATE_INPUT_DATA; - kverify.input.data = data; - kverify.input.data_size = SIGNATURE_HASH_SIZE; - kverify.signature_head.nla_len = NLA_HDRLEN + sizeof(kverify.signature); - kverify.signature_head.nla_type = NCR_ATTR_FINAL_INPUT_DATA; - kverify.signature.data = sig; - kverify.signature.data_size = sizeof(sig); - - ret = ioctl(cfd, NCRIO_SESSION_ONCE, &kverify); - if (ret < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_SESSION_ONCE)"); - return 1; - } - - if (ret) - fprintf(stdout, " Success\n"); - else { - fprintf(stdout, " Verification Failed!\n"); - return 1; - } - - return 0; -} - -static int test_ncr_rsa(int cfd) -{ - int ret; - struct __attribute__ ((packed)) { - struct ncr_key_generate_pair f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_RSA)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - struct nlattr bits_head ALIGN_NL; - uint32_t bits ALIGN_NL; - } kgen; - ncr_key_t pubkey, privkey; - struct ncr_key_export kexport; - uint8_t data[DATA_SIZE]; - int data_size; - - fprintf(stdout, "Tests on RSA key generation:"); - fflush(stdout); - - /* convert it to key */ - privkey = ioctl(cfd, NCRIO_KEY_INIT); - if (privkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - pubkey = ioctl(cfd, NCRIO_KEY_INIT); - if (pubkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kgen, 0, sizeof(kgen)); - kgen.f.input_size = sizeof(kgen); - kgen.f.private_key = privkey; - kgen.f.public_key = pubkey; - kgen.algo_head.nla_len = NLA_HDRLEN + sizeof(kgen.algo); - kgen.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kgen.algo, ALG_RSA); - kgen.flags_head.nla_len = NLA_HDRLEN + sizeof(kgen.flags); - kgen.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kgen.flags = - NCR_KEY_FLAG_EXPORTABLE | NCR_KEY_FLAG_WRAPPABLE | - NCR_KEY_FLAG_ALLOW_TRANSPARENT_HASH; - kgen.bits_head.nla_len = NLA_HDRLEN + sizeof(kgen.bits); - kgen.bits_head.nla_type = NCR_ATTR_RSA_MODULUS_BITS; - kgen.bits = 1024; - - if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_GENERATE_PAIR)"); - return 1; - } - - /* export the private key */ - memset(data, 0, sizeof(data)); - memset(&kexport, 0, sizeof(kexport)); - kexport.key = privkey; - kexport.buffer = data; - kexport.buffer_size = sizeof(data); - - data_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (data_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - ret = privkey_info(data, data_size, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - /* export the public key */ - - memset(data, 0, sizeof(data)); - memset(&kexport, 0, sizeof(kexport)); - kexport.key = pubkey; - kexport.buffer = data; - kexport.buffer_size = sizeof(data); - - data_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (data_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - ret = pubkey_info(data, data_size, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - fprintf(stdout, " Success\n"); - - ret = rsa_key_sign_verify(cfd, privkey, pubkey, 1); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = rsa_key_sign_verify(cfd, privkey, pubkey, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = rsa_key_sign_verify_transparent(cfd, privkey, pubkey, 1); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = rsa_key_sign_verify_transparent(cfd, privkey, pubkey, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = rsa_key_encrypt(cfd, privkey, pubkey, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = rsa_key_encrypt(cfd, privkey, pubkey, 1); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - return 0; - -} - -static int test_ncr_dsa(int cfd) -{ - int ret; - struct __attribute__ ((packed)) { - struct ncr_key_generate_pair f; - struct nlattr algo_head ALIGN_NL; - char algo[sizeof(ALG_DSA)] ALIGN_NL; - struct nlattr flags_head ALIGN_NL; - uint32_t flags ALIGN_NL; - struct nlattr q_bits_head ALIGN_NL; - uint32_t q_bits ALIGN_NL; - struct nlattr p_bits_head ALIGN_NL; - uint32_t p_bits ALIGN_NL; - } kgen; - ncr_key_t pubkey, privkey; - struct ncr_key_export kexport; - uint8_t data[DATA_SIZE]; - int data_size; - - fprintf(stdout, "Tests on DSA key generation:"); - fflush(stdout); - - /* convert it to key */ - privkey = ioctl(cfd, NCRIO_KEY_INIT); - if (privkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - pubkey = ioctl(cfd, NCRIO_KEY_INIT); - if (pubkey == -1) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_INIT)"); - return 1; - } - - memset(&kgen, 0, sizeof(kgen)); - kgen.f.input_size = sizeof(kgen); - kgen.f.private_key = privkey; - kgen.f.public_key = pubkey; - kgen.algo_head.nla_len = NLA_HDRLEN + sizeof(kgen.algo); - kgen.algo_head.nla_type = NCR_ATTR_ALGORITHM; - strcpy(kgen.algo, ALG_DSA); - kgen.flags_head.nla_len = NLA_HDRLEN + sizeof(kgen.flags); - kgen.flags_head.nla_type = NCR_ATTR_KEY_FLAGS; - kgen.flags = - NCR_KEY_FLAG_EXPORTABLE | NCR_KEY_FLAG_WRAPPABLE | - NCR_KEY_FLAG_ALLOW_TRANSPARENT_HASH; - kgen.q_bits_head.nla_len = NLA_HDRLEN + sizeof(kgen.q_bits); - kgen.q_bits_head.nla_type = NCR_ATTR_DSA_Q_BITS; - kgen.q_bits = 160; - kgen.p_bits_head.nla_len = NLA_HDRLEN + sizeof(kgen.p_bits); - kgen.p_bits_head.nla_type = NCR_ATTR_DSA_P_BITS; - kgen.p_bits = 1024; - - if (ioctl(cfd, NCRIO_KEY_GENERATE_PAIR, &kgen)) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_GENERATE_PAIR)"); - return 1; - } - - memset(data, 0, sizeof(data)); - memset(&kexport, 0, sizeof(kexport)); - kexport.key = privkey; - kexport.buffer = data; - kexport.buffer_size = sizeof(data); - - data_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (data_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - ret = privkey_info(data, data_size, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - /* export the public key */ - - memset(data, 0, sizeof(data)); - memset(&kexport, 0, sizeof(kexport)); - kexport.key = pubkey; - kexport.buffer = data; - kexport.buffer_size = sizeof(data); - - data_size = ioctl(cfd, NCRIO_KEY_EXPORT, &kexport); - if (data_size < 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - perror("ioctl(NCRIO_KEY_EXPORT)"); - return 1; - } - - ret = pubkey_info(data, data_size, 0); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - fprintf(stdout, " Success\n"); - - ret = dsa_key_sign_verify(cfd, privkey, pubkey); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - ret = dsa_key_sign_verify_transparent(cfd, privkey, pubkey); - if (ret != 0) { - fprintf(stderr, "Error: %s:%d\n", __func__, __LINE__); - return 1; - } - - return 0; - -} - -int main() -{ - int fd = -1; - - gnutls_global_init(); - - /* actually test if the initial close - * will really delete all used lists */ - - fd = open("/dev/crypto", O_RDWR, 0); - if (fd < 0) { - perror("open(/dev/crypto)"); - return 1; - } - - if (test_ncr_dh(fd)) - return 1; - - if (test_ncr_rsa(fd)) - return 1; - - if (test_ncr_dsa(fd)) - return 1; - - if (test_ncr_wrap_key3(fd)) - return 1; - - /* Close the original descriptor */ - if (close(fd)) { - perror("close(fd)"); - return 1; - } - - return 0; -} |
