]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
tests: gnutls_x509_privkey_import: enhanced to test DER key import
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 30 Jul 2017 17:05:23 +0000 (19:05 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Fri, 4 Aug 2017 14:53:54 +0000 (16:53 +0200)
It seems that this function was not tested for multiple cases of
private keys in DER mode.

Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
tests/gnutls_x509_privkey_import.c

index f3ab5e0c9945ea84408a00f61461f92479deed8e..4bdc58cae6806a122769dee702c2449b5f0ed632 100644 (file)
@@ -57,7 +57,7 @@ static int sign_verify_data(gnutls_x509_privkey_t pkey, gnutls_sign_algorithm_t
 
        ret = gnutls_privkey_import_x509(privkey, pkey, 0);
        if (ret < 0)
-               fail("gnutls_pubkey_import_x509\n");
+               fail("gnutls_privkey_import_x509\n");
 
        ret = gnutls_privkey_sign_data2(privkey, algo, 0,
                                        &raw_data, &signature);
@@ -123,6 +123,48 @@ static void load_privkey(const char *name, const gnutls_datum_t *txtkey, gnutls_
        return;
 }
 
+static void load_privkey_in_der(const char *name, const gnutls_datum_t *txtkey, gnutls_pk_algorithm_t pk,
+                        gnutls_sign_algorithm_t sig, int exp_key_err)
+{
+       gnutls_x509_privkey_t tmp;
+       gnutls_datum_t der;
+       int ret;
+
+       ret = gnutls_x509_privkey_init(&tmp);
+       if (ret < 0)
+               testfail("gnutls_privkey_init\n");
+
+       ret = gnutls_pem_base64_decode2(NULL, txtkey, &der);
+       if (ret < 0 || der.size == 0) {
+               testfail("could not convert key to DER form: %s\n", gnutls_strerror(ret));
+       }
+
+       ret = gnutls_x509_privkey_import(tmp, &der, GNUTLS_X509_FMT_DER);
+       gnutls_free(der.data);
+
+       if (ret < 0) {
+               if (exp_key_err) {
+                       testfail("did not fail in key import, although expected\n");
+               }
+
+               testfail("gnutls_privkey_import: %s\n", gnutls_strerror(ret));
+       }
+
+       if (gnutls_x509_privkey_get_pk_algorithm(tmp) != (int)pk) {
+               testfail("pk algorithm doesn't match!\n");
+       }
+
+       ret = gnutls_x509_privkey_verify_params(tmp);
+       if (ret < 0)
+               testfail("gnutls_privkey_verify_params: %s\n", gnutls_strerror(ret));
+
+       sign_verify_data(tmp, sig);
+
+       gnutls_x509_privkey_deinit(tmp);
+
+       return;
+}
+
 typedef struct test_st {
        const char *name;
        gnutls_pk_algorithm_t pk;
@@ -168,6 +210,10 @@ void doit(void)
 
                load_privkey(tests[i].name, tests[i].key, tests[i].pk,
                             tests[i].sig, tests[i].exp_key_err);
+
+               success("checking: %s in der form\n", tests[i].name);
+               load_privkey_in_der(tests[i].name, tests[i].key, tests[i].pk,
+                            tests[i].sig, tests[i].exp_key_err);
        }
 
        gnutls_global_deinit();