]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
public-key: Add optional parameters argument to verify() method
authorTobias Brunner <tobias@strongswan.org>
Tue, 19 Sep 2017 15:15:18 +0000 (17:15 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 8 Nov 2017 15:48:10 +0000 (16:48 +0100)
28 files changed:
scripts/pubkey_speed.c
src/charon-tkm/src/tkm/tkm_public_key.c
src/libcharon/sa/ikev1/authenticators/pubkey_v1_authenticator.c
src/libcharon/sa/ikev2/authenticators/pubkey_authenticator.c
src/libimcv/pts/pts.c
src/libstrongswan/credentials/keys/public_key.c
src/libstrongswan/credentials/keys/public_key.h
src/libstrongswan/plugins/bliss/bliss_public_key.c
src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sign.c
src/libstrongswan/plugins/curve25519/curve25519_public_key.c
src/libstrongswan/plugins/gcrypt/gcrypt_rsa_public_key.c
src/libstrongswan/plugins/gmp/gmp_rsa_public_key.c
src/libstrongswan/plugins/openssl/openssl_crl.c
src/libstrongswan/plugins/openssl/openssl_ec_public_key.c
src/libstrongswan/plugins/openssl/openssl_pkcs7.c
src/libstrongswan/plugins/openssl/openssl_rsa_public_key.c
src/libstrongswan/plugins/openssl/openssl_x509.c
src/libstrongswan/plugins/pkcs11/pkcs11_public_key.c
src/libstrongswan/plugins/pkcs7/pkcs7_signed_data.c
src/libstrongswan/plugins/x509/x509_ac.c
src/libstrongswan/plugins/x509/x509_cert.c
src/libstrongswan/plugins/x509/x509_crl.c
src/libstrongswan/plugins/x509/x509_ocsp_response.c
src/libstrongswan/plugins/x509/x509_pkcs10.c
src/libstrongswan/tests/suites/test_ecdsa.c
src/libstrongswan/tests/suites/test_ed25519.c
src/libstrongswan/tests/suites/test_rsa.c
src/libtls/tls_crypto.c

index 66279ada365e5cd35eb225ee92b8f9e70f8cf1a3..8ccaa0bf891b6cced8f9233c75d1fd4dd2698437 100644 (file)
@@ -135,7 +135,7 @@ int main(int argc, char *argv[])
        start_timing(&timing);
        for (round = 0; round < rounds; round++)
        {
-               if (!public->verify(public, scheme, data, sigs[round]))
+               if (!public->verify(public, scheme, NULL, data, sigs[round]))
                {
                        printf("signature verification failed\n");
                        exit(1);
index 9ebdc29e6ad39492c80a3d2754eb9673395119bf..788336cc1b2a18e3b7427cc44bd5d21b459a5b0a 100644 (file)
@@ -53,7 +53,7 @@ METHOD(public_key_t, get_type, key_type_t,
 }
 
 METHOD(public_key_t, verify, bool,
-       private_tkm_public_key_t *this, signature_scheme_t scheme,
+       private_tkm_public_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t signature)
 {
        return TRUE;
index 344c1bf5dbb0ea97e6907349a29cdd8a40f8f0cb..8e048c82aeeb3e174852e6bdbe861e491b0460cb 100644 (file)
@@ -176,7 +176,7 @@ METHOD(authenticator_t, process, status_t,
                                                                                                                id, auth, TRUE);
        while (enumerator->enumerate(enumerator, &public, &current_auth))
        {
-               if (public->verify(public, scheme, hash, sig))
+               if (public->verify(public, scheme, NULL, hash, sig))
                {
                        DBG1(DBG_IKE, "authentication of '%Y' with %N successful",
                                 id, signature_scheme_names, scheme);
index b2b1ef2896bda7ce68905f2085c62ab32de688b5..e47abc72d840fd63aaaa005098534fd4a64fea75 100644 (file)
@@ -434,7 +434,7 @@ METHOD(authenticator_t, process, status_t,
                                                                                                        key_type, id, auth, online);
        while (enumerator->enumerate(enumerator, &public, &current_auth))
        {
-               if (public->verify(public, scheme, octets, auth_data))
+               if (public->verify(public, scheme, NULL, octets, auth_data))
                {
                        DBG1(DBG_IKE, "authentication of '%Y' with %N successful", id,
                                 auth_method == AUTH_DS ? signature_scheme_names : auth_method_names,
index d771d07edd142367ad9a9c86505db6dd99f9d104..09ffd71606424d9d5bfa0a16853deb88627fc9e8 100644 (file)
@@ -762,7 +762,7 @@ METHOD(pts_t, verify_quote_signature, bool,
                        return FALSE;
        }
 
-       if (!aik_pubkey->verify(aik_pubkey, scheme, digest, signature))
+       if (!aik_pubkey->verify(aik_pubkey, scheme, NULL, digest, signature))
        {
                DBG1(DBG_PTS, "signature verification failed for TPM Quote Info");
                DESTROY_IF(aik_pubkey);
index 17b90b43bf63f686e29b5b68e8f23627f16b8df7..74a27d050879ae906eebb2f537a1bce3cc746c87 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 2015 Tobias Brunner
- * Copyright (C) 2007 Martin Willi
+ * Copyright (C) 2015-2017 Tobias Brunner
  * Copyright (C) 2014-2016 Andreas Steffen
+ * Copyright (C) 2007 Martin Willi
  * HSR Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
index 32cb0c3a06d002a25fb6ea744ae9b40f9f33c207..186530ff6e6dd501e585d84b44b14c94c5162b1b 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 2015 Tobias Brunner
- * Copyright (C) 2007 Martin Willi
+ * Copyright (C) 2015-2017 Tobias Brunner
  * Copyright (C) 2014-2017 Andreas Steffen
+ * Copyright (C) 2007 Martin Willi
  * HSR Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -170,12 +170,13 @@ struct public_key_t {
        /**
         * Verifies a signature against a chunk of data.
         *
-        * @param scheme        signature scheme to use for verification, may be default
+        * @param scheme        signature scheme to use for verification
+        * @param params        optional parameters required by the specified scheme
         * @param data          data to check signature against
         * @param signature     signature to check
         * @return                      TRUE if signature matches
         */
-       bool (*verify)(public_key_t *this, signature_scheme_t scheme,
+       bool (*verify)(public_key_t *this, signature_scheme_t scheme, void *params,
                                   chunk_t data, chunk_t signature);
 
        /**
index f7ddbbfd201d6c0a6eb7bea12a46d5a5797b5219..945840cdce3e5ae55cfc7c0e95e6a419299e2a97 100644 (file)
@@ -194,7 +194,7 @@ end:
 }
 
 METHOD(public_key_t, verify, bool,
-       private_bliss_public_key_t *this, signature_scheme_t scheme,
+       private_bliss_public_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t signature)
 {
        switch (scheme)
index d871068dabae15f90412791976611e954de68c80..dc50115f30edcfd8f5a0482bcd09dbdedc3bac5b 100644 (file)
@@ -120,7 +120,7 @@ START_TEST(test_bliss_sign_all)
                {
                        ck_assert(privkey->sign(privkey, signature_scheme, msg,
                                                                        &signature));
-                       ck_assert(pubkey->verify(pubkey, signature_scheme, msg,
+                       ck_assert(pubkey->verify(pubkey, signature_scheme, NULL, msg,
                                                                         signature));
                        free(signature.ptr);
                }
@@ -179,11 +179,11 @@ START_TEST(test_bliss_sign_fail)
        ck_assert(privkey->sign(privkey, SIGN_BLISS_WITH_SHA2_512, msg, &signature));
 
        /* verify with invalid signature scheme */
-       ck_assert(!pubkey->verify(pubkey, SIGN_UNKNOWN, msg, signature));
+       ck_assert(!pubkey->verify(pubkey, SIGN_UNKNOWN, NULL, msg, signature));
 
        /* corrupt signature */
        signature.ptr[signature.len - 1] ^= 0x80;
-       ck_assert(!pubkey->verify(pubkey, SIGN_BLISS_WITH_SHA2_512, msg, signature));
+       ck_assert(!pubkey->verify(pubkey, SIGN_BLISS_WITH_SHA2_512, NULL, msg, signature));
 
        free(signature.ptr);
        privkey->destroy(privkey);
index d077763547e9d9b6dafd1e82ef72ba0b3d9d17fc..1d4dec56594a3566105ca9f0495e49f567791303 100644 (file)
@@ -50,7 +50,7 @@ METHOD(public_key_t, get_type, key_type_t,
 
 METHOD(public_key_t, verify, bool,
        private_curve25519_public_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t signature)
+       void *params, chunk_t data, chunk_t signature)
 {
        hasher_t *hasher;
        uint8_t d = 0, k[HASH_SIZE_SHA512], r[32], *sig;
index 90829e0521ea854e6b776de0dfb4b39f7581d312..5820a89987667c6f3646ab7b4d68ebb2db5ac575 100644 (file)
@@ -167,7 +167,7 @@ METHOD(public_key_t, get_type, key_type_t,
 
 METHOD(public_key_t, verify, bool,
        private_gcrypt_rsa_public_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t signature)
+       void *params, chunk_t data, chunk_t signature)
 {
        switch (scheme)
        {
index 065c889033440bc34969631a26982a198bcdddf2..7194fee150763e4b1946811e9d8391f2886a4330 100644 (file)
@@ -290,7 +290,7 @@ METHOD(public_key_t, get_type, key_type_t,
 }
 
 METHOD(public_key_t, verify, bool,
-       private_gmp_rsa_public_key_t *this, signature_scheme_t scheme,
+       private_gmp_rsa_public_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t signature)
 {
        switch (scheme)
index 503f7bf27860e0d290dfc8c80a5cbe66b3a48312..663f0915d034e41e68179881e18879c392dd0c56 100644 (file)
@@ -332,7 +332,8 @@ METHOD(certificate_t, issued_by, bool,
        tbs = openssl_i2chunk(X509_CRL_INFO, this->crl->crl);
 #endif
        X509_CRL_get0_signature(this->crl, &sig, NULL);
-       valid = key->verify(key, this->scheme, tbs, openssl_asn1_str2chunk(sig));
+       valid = key->verify(key, this->scheme, NULL, tbs,
+                                               openssl_asn1_str2chunk(sig));
        free(tbs.ptr);
        key->destroy(key);
        if (valid && scheme)
index a1e56fc5e386bb47106fec108c44b544748dabb4..faa940839b138e42f9278c61902fae6d956b6d9e 100644 (file)
@@ -151,7 +151,7 @@ METHOD(public_key_t, get_type, key_type_t,
 
 METHOD(public_key_t, verify, bool,
        private_openssl_ec_public_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t signature)
+       void *params, chunk_t data, chunk_t signature)
 {
        switch (scheme)
        {
index 83ac8df5b2be9388e80337009290499cf3983a0f..f94767cf5f07810ce58abb3d2231c6ab4b048961 100644 (file)
@@ -256,7 +256,7 @@ static auth_cfg_t *verify_signature(CMS_SignerInfo *si, int hash_oid)
                        key = cert->get_public_key(cert);
                        if (key)
                        {
-                               if (key->verify(key, signature_scheme_from_oid(hash_oid),
+                               if (key->verify(key, signature_scheme_from_oid(hash_oid), NULL,
                                                                attrs, sig))
                                {
                                        found = auth->clone(auth);
index d3a644f7293d877433b52bd52b4a785cae232cd0..078b26165b30dccbbf3d35f7d405ccc0de127e21 100644 (file)
@@ -137,7 +137,7 @@ METHOD(public_key_t, get_type, key_type_t,
 
 METHOD(public_key_t, verify, bool,
        private_openssl_rsa_public_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t signature)
+       void *params, chunk_t data, chunk_t signature)
 {
        switch (scheme)
        {
index 0d0b997accd10790991737defeb654d1a45e685e..7e077e74da72b0178989522a5468424fcc571209 100644 (file)
@@ -430,7 +430,8 @@ METHOD(certificate_t, issued_by, bool,
        tbs = openssl_i2chunk(X509_CINF, this->x509->cert_info);
 #endif
        X509_get0_signature(&sig, NULL, this->x509);
-       valid = key->verify(key, this->scheme, tbs, openssl_asn1_str2chunk(sig));
+       valid = key->verify(key, this->scheme, NULL, tbs,
+                                               openssl_asn1_str2chunk(sig));
        free(tbs.ptr);
        key->destroy(key);
        if (valid && scheme)
index 38477761018bfd38c265932ba51c67b3ddbcf541..36029fa306e9befd14531d53140c5d97d68c8e0f 100644 (file)
@@ -201,7 +201,7 @@ METHOD(public_key_t, get_keysize, int,
 }
 
 METHOD(public_key_t, verify, bool,
-       private_pkcs11_public_key_t *this, signature_scheme_t scheme,
+       private_pkcs11_public_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t sig)
 {
        CK_MECHANISM_PTR mechanism;
index 413c3fff5a7950ba8bc13976aecb85720a796d94..4d822a4f7b12abd3da02538f2e665b2f74b10dd6 100644 (file)
@@ -227,7 +227,8 @@ METHOD(enumerator_t, enumerate, bool,
                                if (key)
                                {
                                        chunk = info->attributes->get_encoding(info->attributes);
-                                       if (key->verify(key, scheme, chunk, info->encrypted_digest))
+                                       if (key->verify(key, scheme, NULL, chunk,
+                                                                       info->encrypted_digest))
                                        {
                                                this->auth = auth->clone(auth);
                                                key->destroy(key);
index ba459288bb8d98f05530697a14c6de312004d563..a01b2704968c734a1d1d716bd30e0bd36f3586bd 100644 (file)
@@ -933,7 +933,8 @@ METHOD(certificate_t, issued_by, bool,
        {
                return FALSE;
        }
-       valid = key->verify(key, scheme, this->certificateInfo, this->signature);
+       valid = key->verify(key, scheme, NULL, this->certificateInfo,
+                                               this->signature);
        key->destroy(key);
        if (valid && schemep)
        {
index dea2c704175930633aff6b915a3de379d62b2a4b..c626859ae1fbe0aae863f798b457b2e46261f861 100644 (file)
@@ -1719,7 +1719,8 @@ METHOD(certificate_t, issued_by, bool,
        {
                return FALSE;
        }
-       valid = key->verify(key, scheme, this->tbsCertificate, this->signature);
+       valid = key->verify(key, scheme, NULL, this->tbsCertificate,
+                                               this->signature);
        key->destroy(key);
        if (valid && schemep)
        {
index 6d18ea544c65ce61815dad127180e71ba3f321d8..5896aa205650de29623394e6b2f1706d7ad6b300 100644 (file)
@@ -502,7 +502,7 @@ METHOD(certificate_t, issued_by, bool,
        {
                return FALSE;
        }
-       valid = key->verify(key, scheme, this->tbsCertList, this->signature);
+       valid = key->verify(key, scheme, NULL, this->tbsCertList, this->signature);
        key->destroy(key);
        if (valid && schemep)
        {
index 140e9bfa991acbc547636bb848a73d330228eedd..fd0d84e480f9194420244887bba9a7f906b329a4 100644 (file)
@@ -753,7 +753,8 @@ METHOD(certificate_t, issued_by, bool,
        {
                return FALSE;
        }
-       valid = key->verify(key, scheme, this->tbsResponseData, this->signature);
+       valid = key->verify(key, scheme, NULL, this->tbsResponseData,
+                                               this->signature);
        key->destroy(key);
        if (valid && schemep)
        {
index e39e24bff4251800be88d4eead7305326d3a1752..54555417267a84906bd91c561679f1ff605dbf38 100644 (file)
@@ -152,7 +152,7 @@ METHOD(certificate_t, issued_by, bool,
        {
                return FALSE;
        }
-       valid = key->verify(key, scheme, this->certificationRequestInfo,
+       valid = key->verify(key, scheme, NULL, this->certificationRequestInfo,
                                                this->signature);
        if (valid && schemep)
        {
index 3c842996d2d43f35a596e7fb795c73057f0670b2..d30d87ecf0f1d549b7c5e79980a87f41d23544ef 100644 (file)
@@ -59,7 +59,7 @@ static void test_good_sig(private_key_t *privkey, public_key_t *pubkey)
                }
                fail_unless(privkey->sign(privkey, schemes[i].scheme, data, &sig),
                                        "sign %N", signature_scheme_names, schemes[i].scheme);
-               fail_unless(pubkey->verify(pubkey, schemes[i].scheme, data, sig),
+               fail_unless(pubkey->verify(pubkey, schemes[i].scheme, NULL, data, sig),
                                        "verify %N", signature_scheme_names, schemes[i].scheme);
                free(sig.ptr);
        }
@@ -121,7 +121,8 @@ static void test_bad_sigs(public_key_t *pubkey)
                for (i = 0; i < countof(invalid_sigs); i++)
                {
                        fail_if(
-                               pubkey->verify(pubkey, schemes[s].scheme, data, invalid_sigs[i]),
+                               pubkey->verify(pubkey, schemes[s].scheme, NULL, data,
+                                                          invalid_sigs[i]),
                                "bad %N sig accepted %B",
                                signature_scheme_names, schemes[s].scheme,
                                &invalid_sigs[i]);
index 00842628dab6360e921441351e43a60168fd949f..6fbec126d5998841e1907b654524a95d1a8479ac 100644 (file)
@@ -302,8 +302,8 @@ START_TEST(test_ed25519_sign)
        ck_assert(chunk_equals(sig, sig_tests[_i].sig));
 
        /* verify */
-       ck_assert(pubkey->verify(pubkey, SIGN_ED25519, sig_tests[_i].msg,
-                                                                                                  sig_tests[_i].sig));
+       ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[_i].msg,
+                                                        sig_tests[_i].sig));
 
        /* cleanup */
        key->destroy(key);
@@ -375,10 +375,10 @@ START_TEST(test_ed25519_gen)
        ck_assert(!pubkey->encrypt(pubkey, ENCRYPT_UNKNOWN, msg, NULL));
 
        /* verify with wrong signature scheme */
-       ck_assert(!pubkey->verify(pubkey, SIGN_ED448, msg, sig));
+       ck_assert(!pubkey->verify(pubkey, SIGN_ED448, NULL, msg, sig));
 
        /* verify with correct signature scheme */
-       ck_assert(pubkey->verify(pubkey, SIGN_ED25519, msg, sig));
+       ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, msg, sig));
 
        /* cleanup */
        key->destroy(key);
@@ -407,7 +407,7 @@ START_TEST(test_ed25519_speed)
                ck_assert(key->sign(key, SIGN_ED25519, msg, &sig));
                pubkey = key->get_public_key(key);
                ck_assert(pubkey != NULL);
-               ck_assert(pubkey->verify(pubkey, SIGN_ED25519, msg, sig));
+               ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, msg, sig));
                key->destroy(key);
                pubkey->destroy(pubkey);
                chunk_free(&sig);
@@ -476,25 +476,29 @@ START_TEST(test_ed25519_fail)
                                        BUILD_BLOB_ASN1_DER, sig_tests[0].pubkey, BUILD_END);
        ck_assert(pubkey != NULL);
 
-       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, chunk_empty, chunk_empty));
+       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, chunk_empty,
+                                                         chunk_empty));
 
        /* malformed signature */
        sig = chunk_create(sig1, 64);
        memcpy(sig1, sig_tests[0].sig.ptr, 64);
        sig1[63] |= 0xe0;
-       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, sig_tests[0].msg, sig));
+       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
+                                                         sig));
 
        /* wrong signature */
        memcpy(sig1, sig_tests[0].sig.ptr, 64);
        sig1[0] = 0xe4;
-       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, sig_tests[0].msg, sig));
+       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
+                                                         sig));
 
        /* detect all-zeroes public key */
        pubkey->destroy(pubkey);
        pubkey = lib->creds->create(lib->creds, CRED_PUBLIC_KEY, KEY_ED25519,
                                        BUILD_BLOB_ASN1_DER, zero_pk, BUILD_END);
        ck_assert(pubkey != NULL);
-       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, sig_tests[0].msg, sig));
+       ck_assert(!pubkey->verify(pubkey, SIGN_ED25519, NULL, sig_tests[0].msg,
+                                                         sig));
        pubkey->destroy(pubkey);
 }
 END_TEST
index 41e78352159b58862a7cf348477ce09f7af4e693..a1559802d80d40a1e31937bd97ad375744798aae 100644 (file)
@@ -49,7 +49,7 @@ static void test_good_sig(private_key_t *privkey, public_key_t *pubkey)
                }
                fail_unless(privkey->sign(privkey, schemes[i], data, &sig),
                                        "sign %N", signature_scheme_names, schemes[i]);
-               fail_unless(pubkey->verify(pubkey, schemes[i], data, sig),
+               fail_unless(pubkey->verify(pubkey, schemes[i], NULL, data, sig),
                                        "verify %N", signature_scheme_names, schemes[i]);
                free(sig.ptr);
        }
@@ -106,7 +106,7 @@ static void test_bad_sigs(public_key_t *pubkey)
                for (i = 0; i < countof(invalid_sigs); i++)
                {
                        fail_if(
-                               pubkey->verify(pubkey, schemes[s], data, invalid_sigs[i]),
+                               pubkey->verify(pubkey, schemes[s], NULL, data, invalid_sigs[i]),
                                "bad %N sig accepted %B", signature_scheme_names, schemes[s],
                                &invalid_sigs[i]);
                }
index 05ae62b495b8713d94713694f6f8f1f5139a43fa..29af5d978c395eab8922cace68b363d6655ca9db 100644 (file)
@@ -1509,7 +1509,7 @@ METHOD(tls_crypto_t, verify, bool,
                                 tls_signature_algorithm_names, alg);
                        return FALSE;
                }
-               if (!key->verify(key, scheme, data, sig))
+               if (!key->verify(key, scheme, NULL, data, sig))
                {
                        return FALSE;
                }
@@ -1533,7 +1533,8 @@ METHOD(tls_crypto_t, verify, bool,
                                {
                                        return FALSE;
                                }
-                               done = key->verify(key, SIGN_RSA_EMSA_PKCS1_NULL, hash, sig);
+                               done = key->verify(key, SIGN_RSA_EMSA_PKCS1_NULL, NULL, hash,
+                                                                  sig);
                                free(hash.ptr);
                                if (!done)
                                {
@@ -1542,7 +1543,8 @@ METHOD(tls_crypto_t, verify, bool,
                                DBG2(DBG_TLS, "verified signature data with MD5+SHA1/RSA");
                                break;
                        case KEY_ECDSA:
-                               if (!key->verify(key, SIGN_ECDSA_WITH_SHA1_DER, data, sig))
+                               if (!key->verify(key, SIGN_ECDSA_WITH_SHA1_DER, NULL, data,
+                                                                sig))
                                {
                                        return FALSE;
                                }