]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
private-key: Add optional parameters argument to sign() method
authorTobias Brunner <tobias@strongswan.org>
Tue, 19 Sep 2017 15:26:58 +0000 (17:26 +0200)
committerTobias Brunner <tobias@strongswan.org>
Wed, 8 Nov 2017 15:48:10 +0000 (16:48 +0100)
29 files changed:
scripts/pubkey_speed.c
src/charon-tkm/src/tkm/tkm_private_key.c
src/conftest/hooks/pretend_auth.c
src/conftest/hooks/rebuild_auth.c
src/frontends/android/app/src/main/jni/libandroidbridge/backend/android_private_key.c
src/libcharon/sa/ikev1/authenticators/pubkey_v1_authenticator.c
src/libcharon/sa/ikev2/authenticators/pubkey_authenticator.c
src/libstrongswan/credentials/keys/private_key.h
src/libstrongswan/plugins/agent/agent_private_key.c
src/libstrongswan/plugins/bliss/bliss_private_key.c
src/libstrongswan/plugins/bliss/tests/suites/test_bliss_sign.c
src/libstrongswan/plugins/curve25519/curve25519_private_key.c
src/libstrongswan/plugins/gcrypt/gcrypt_rsa_private_key.c
src/libstrongswan/plugins/gmp/gmp_rsa_private_key.c
src/libstrongswan/plugins/openssl/openssl_ec_private_key.c
src/libstrongswan/plugins/openssl/openssl_rsa_private_key.c
src/libstrongswan/plugins/pgp/pgp_builder.c
src/libstrongswan/plugins/pkcs11/pkcs11_private_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_request.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
src/libtpmtss/plugins/tpm/tpm_private_key.c

index 8ccaa0bf891b6cced8f9233c75d1fd4dd2698437..2928772b8d67b6e3136a85e13113b44069ebb5b5 100644 (file)
@@ -118,7 +118,7 @@ int main(int argc, char *argv[])
        start_timing(&timing);
        for (round = 0; round < rounds; round++)
        {
-               if (!private->sign(private, scheme, data, &sigs[round]))
+               if (!private->sign(private, scheme, NULL, data, &sigs[round]))
                {
                        printf("creating signature failed\n");
                        exit(1);
index db57ec1c7b711748761df6a7eed01794f96e2f89..02351b61c4bfc86303ac19fb82893a14ddfbd89d 100644 (file)
@@ -58,7 +58,7 @@ METHOD(private_key_t, get_type, key_type_t,
 }
 
 METHOD(private_key_t, sign, bool,
-       private_tkm_private_key_t *this, signature_scheme_t scheme,
+       private_tkm_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        signature_type sig;
index d80196ed6bf0f8cab86d9336c1901f06efed5f2f..4be6f45db018615fcaa7ec43161fe20c3aedf31c 100644 (file)
@@ -244,7 +244,7 @@ static bool build_auth(private_pretend_auth_t *this,
                private->destroy(private);
                return FALSE;
        }
-       if (!private->sign(private, scheme, octets, &auth_data))
+       if (!private->sign(private, scheme, NULL, octets, &auth_data))
        {
                chunk_free(&octets);
                private->destroy(private);
index b2df278a5d4907731ecc55b42c07fd8ff8bef071..bc20292a11679ecc1cadafa3026d4d1effcf0b1d 100644 (file)
@@ -143,7 +143,7 @@ static bool rebuild_auth(private_rebuild_auth_t *this, ike_sa_t *ike_sa,
                id->destroy(id);
                return FALSE;
        }
-       if (!private->sign(private, scheme, octets, &auth_data))
+       if (!private->sign(private, scheme, NULL, octets, &auth_data))
        {
                chunk_free(&octets);
                private->destroy(private);
index d1f1bcb4e3827265080d3026d0f8ae98d9c107ac..4e49c2e4dd6e053a704e274d6de7cf6809edd3eb 100644 (file)
@@ -53,7 +53,7 @@ struct private_private_key_t {
 };
 
 METHOD(private_key_t, sign, bool,
-       private_private_key_t *this, signature_scheme_t scheme,
+       private_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        JNIEnv *env;
index 8e048c82aeeb3e174852e6bdbe861e491b0460cb..41be15a08767f1a3808f560a4b273e323aa81199 100644 (file)
@@ -110,7 +110,7 @@ METHOD(authenticator_t, build, status_t,
        }
        free(dh.ptr);
 
-       if (private->sign(private, scheme, hash, &sig))
+       if (private->sign(private, scheme, NULL, hash, &sig))
        {
                sig_payload = hash_payload_create(PLV1_SIGNATURE);
                sig_payload->set_hash(sig_payload, sig);
index e47abc72d840fd63aaaa005098534fd4a64fea75..befdfe38775276ff96dd50c48e74ea7f282203fd 100644 (file)
@@ -222,7 +222,7 @@ static status_t sign_signature_auth(private_pubkey_authenticator_t *this,
                while (enumerator->enumerate(enumerator, &schemep))
                {
                        scheme = *schemep;
-                       if (private->sign(private, scheme, octets, auth_data) &&
+                       if (private->sign(private, scheme, NULL, octets, auth_data) &&
                                build_signature_auth_data(auth_data, scheme))
                        {
                                status = SUCCESS;
@@ -318,7 +318,7 @@ static status_t sign_classic(private_pubkey_authenticator_t *this,
        }
 
        if (get_auth_octets_scheme(this, FALSE, id, &octets, &scheme) &&
-               private->sign(private, scheme, octets, auth_data))
+               private->sign(private, scheme, NULL, octets, auth_data))
        {
                status = SUCCESS;
        }
index b9f7dad550a9d49cff7ee4a12e128aa2f4645cd2..d7cfdd74df5bbd125130786e0915d6e5f602bf55 100644 (file)
@@ -1,6 +1,7 @@
 /*
+ * Copyright (C) 2017 Tobias Brunner
  * Copyright (C) 2007 Martin Willi
- * Hochschule fuer Technik Rapperswil
+ * HSR Hochschule fuer Technik Rapperswil
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -42,11 +43,12 @@ struct private_key_t {
         * Create a signature over a chunk of data.
         *
         * @param scheme        signature scheme to use
+        * @param params        optional parameters required by the specified scheme
         * @param data          chunk of data to sign
         * @param signature     where to allocate created signature
         * @return                      TRUE if signature created
         */
-       bool (*sign)(private_key_t *this, signature_scheme_t scheme,
+       bool (*sign)(private_key_t *this, signature_scheme_t scheme, void *params,
                                 chunk_t data, chunk_t *signature);
        /**
         * Decrypt a chunk of data.
index bb55c45c00b1ea42fd81854953ebc92533750c4e..cf2c5ea85d586641e7cb40450e65a80dc823f0df 100644 (file)
@@ -233,7 +233,7 @@ static bool scheme_supported(private_agent_private_key_t *this,
 }
 
 METHOD(private_key_t, sign, bool,
-       private_agent_private_key_t *this, signature_scheme_t scheme,
+       private_agent_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        uint32_t len, flags;
index 25253ed378f49a097b4706f505276db2cb3f629d..964edcd93db548453498f5e0f3fcfb6af10e6d23 100644 (file)
@@ -512,7 +512,7 @@ end:
 }
 
 METHOD(private_key_t, sign, bool,
-       private_bliss_private_key_t *this, signature_scheme_t scheme,
+       private_bliss_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        switch (scheme)
index dc50115f30edcfd8f5a0482bcd09dbdedc3bac5b..908ea910d7c91b884eac0e42948478a213898ce7 100644 (file)
@@ -118,7 +118,7 @@ START_TEST(test_bliss_sign_all)
                /* generate and verify 1000 BLISS signatures */
                while (verify_count--)
                {
-                       ck_assert(privkey->sign(privkey, signature_scheme, msg,
+                       ck_assert(privkey->sign(privkey, signature_scheme, NULL, msg,
                                                                        &signature));
                        ck_assert(pubkey->verify(pubkey, signature_scheme, NULL, msg,
                                                                         signature));
@@ -172,11 +172,11 @@ START_TEST(test_bliss_sign_fail)
        ck_assert(!privkey->decrypt(privkey, ENCRYPT_UNKNOWN, chunk_empty, NULL));
 
        /* sign with invalid signature scheme */
-       ck_assert(!privkey->sign(privkey, SIGN_UNKNOWN, msg, &signature));
+       ck_assert(!privkey->sign(privkey, SIGN_UNKNOWN, NULL, msg, &signature));
 
        /* generate valid signature */
        msg = chunk_from_str("Hello Dolly!");
-       ck_assert(privkey->sign(privkey, SIGN_BLISS_WITH_SHA2_512, msg, &signature));
+       ck_assert(privkey->sign(privkey, SIGN_BLISS_WITH_SHA2_512, NULL, msg, &signature));
 
        /* verify with invalid signature scheme */
        ck_assert(!pubkey->verify(pubkey, SIGN_UNKNOWN, NULL, msg, signature));
index 2a7303c4b02cc3a83a804815e08877b4de506427..878be4ca587775dce6fd97bb6ca02057f648dc1f 100644 (file)
@@ -63,7 +63,7 @@ METHOD(private_key_t, get_type, key_type_t,
 
 METHOD(private_key_t, sign, bool,
        private_curve25519_private_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t *signature)
+       void *params, chunk_t data, chunk_t *signature)
 {
        uint8_t r[HASH_SIZE_SHA512], k[HASH_SIZE_SHA512], sig[HASH_SIZE_SHA512];
        hasher_t *hasher;
index 15b876b3fcba06baff8bc58a67ac149332cd8b0a..71bc4c902e61a02ee76f9d9f5e2ad7083959bf35 100644 (file)
@@ -200,7 +200,7 @@ METHOD(private_key_t, get_type, key_type_t,
 
 METHOD(private_key_t, sign, bool,
        private_gcrypt_rsa_private_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t *sig)
+       void *params, chunk_t data, chunk_t *sig)
 {
        switch (scheme)
        {
index 21b420866e2fca2e4daef512fc163c17a9437106..ae376b9d0a8557b0b0429ceb45f5a6f0255f0ab2 100644 (file)
@@ -341,7 +341,7 @@ METHOD(private_key_t, get_type, key_type_t,
 
 METHOD(private_key_t, sign, bool,
        private_gmp_rsa_private_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t *signature)
+       void *params, chunk_t data, chunk_t *signature)
 {
        switch (scheme)
        {
index d187c06edb9e71802c0926427eb8ccd196863cdc..364190758c95910c03b2e6dd2ecba028103166a7 100644 (file)
@@ -151,7 +151,7 @@ static bool build_der_signature(private_openssl_ec_private_key_t *this,
 
 METHOD(private_key_t, sign, bool,
        private_openssl_ec_private_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t *signature)
+       void *params, chunk_t data, chunk_t *signature)
 {
        switch (scheme)
        {
index fd624e6a342cd440a9be38c2ec537e8fffea295e..f2c320f5513e0570aa4ce579fde51ae58c11f5f8 100644 (file)
@@ -149,7 +149,7 @@ METHOD(private_key_t, get_type, key_type_t,
 
 METHOD(private_key_t, sign, bool,
        private_openssl_rsa_private_key_t *this, signature_scheme_t scheme,
-       chunk_t data, chunk_t *signature)
+       void *params, chunk_t data, chunk_t *signature)
 {
        switch (scheme)
        {
index fe0be45d9569fdd035827deb988a16525f53a0fd..e8f5c5ddf3b7fcb8c7e7f82f3d97e701802a55eb 100644 (file)
@@ -116,21 +116,17 @@ static private_key_t *parse_rsa_private_key(chunk_t blob)
                                                BUILD_END);
 }
 
-/**
- * Implementation of private_key_t.sign for encryption-only keys
- */
-static bool sign_not_allowed(private_key_t *this, signature_scheme_t scheme,
-                                                        chunk_t data, chunk_t *signature)
+METHOD(private_key_t, sign_not_allowed, bool,
+       private_key_t *this, signature_scheme_t scheme, void *params,
+       chunk_t data, chunk_t *signature)
 {
        DBG1(DBG_LIB, "signing failed - decryption only key");
        return FALSE;
 }
 
-/**
- * Implementation of private_key_t.decrypt for signature-only keys
- */
-static bool decrypt_not_allowed(private_key_t *this, encryption_scheme_t scheme,
-                                                               chunk_t crypto, chunk_t *plain)
+METHOD(private_key_t, decrypt_not_allowed, bool,
+       private_key_t *this, encryption_scheme_t scheme,
+       chunk_t crypto, chunk_t *plain)
 {
        DBG1(DBG_LIB, "decryption failed - signature only key");
        return FALSE;
@@ -186,7 +182,7 @@ static private_key_t *parse_private_key(chunk_t blob)
                                                                          BUILD_BLOB_PGP, packet, BUILD_END);
                        if (key)
                        {
-                               key->sign = sign_not_allowed;
+                               key->sign = _sign_not_allowed;
                        }
                        return key;
                case PGP_PUBKEY_ALG_RSA_SIGN_ONLY:
@@ -194,7 +190,7 @@ static private_key_t *parse_private_key(chunk_t blob)
                                                                          BUILD_BLOB_PGP, packet, BUILD_END);
                        if (key)
                        {
-                               key->decrypt = decrypt_not_allowed;
+                               key->decrypt = _decrypt_not_allowed;
                        }
                        return key;
                case PGP_PUBKEY_ALG_ECDSA:
index 1d10169113730b6a565f2137aeb02f391491082d..6158f6d254ff56a197b77e28130eb2f1a29262f6 100644 (file)
@@ -243,7 +243,7 @@ static bool reauth(private_pkcs11_private_key_t *this,
 }
 
 METHOD(private_key_t, sign, bool,
-       private_pkcs11_private_key_t *this, signature_scheme_t scheme,
+       private_pkcs11_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        CK_MECHANISM_PTR mechanism;
index 4d822a4f7b12abd3da02538f2e665b2f74b10dd6..9b6d3a8089532dd6f375003f689c95cd530534d4 100644 (file)
@@ -564,7 +564,7 @@ static bool generate(private_pkcs7_signed_data_t *this, private_key_t *key,
 
        attributes = pkcs9->get_encoding(pkcs9);
 
-       if (!key->sign(key, scheme, attributes, &encryptedDigest))
+       if (!key->sign(key, scheme, NULL, attributes, &encryptedDigest))
        {
                free(data.ptr);
                return FALSE;
index a01b2704968c734a1d1d716bd30e0bd36f3586bd..2a1ef638b87208395da36e1d2907e883ede8bf27 100644 (file)
@@ -763,7 +763,7 @@ static bool build_ac(private_x509_ac_t *this)
        chunk_t signatureValue, attributeCertificateInfo;
 
        attributeCertificateInfo = build_attr_cert_info(this);
-       if (!this->signerKey->sign(this->signerKey, SIGN_RSA_EMSA_PKCS1_SHA1,
+       if (!this->signerKey->sign(this->signerKey, SIGN_RSA_EMSA_PKCS1_SHA1, NULL,
                                                           attributeCertificateInfo, &signatureValue))
        {
                free(attributeCertificateInfo.ptr);
index c626859ae1fbe0aae863f798b457b2e46261f861..6d2fb9de7911e35ce4fa8f062b4673efe10cb7f0 100644 (file)
@@ -2562,7 +2562,8 @@ static bool generate(private_x509_cert_t *cert, certificate_t *sign_cert,
                subject->get_encoding(subject),
                key_info, extensions);
 
-       if (!sign_key->sign(sign_key, scheme, cert->tbsCertificate, &cert->signature))
+       if (!sign_key->sign(sign_key, scheme, NULL, cert->tbsCertificate,
+                                               &cert->signature))
        {
                return FALSE;
        }
index 5896aa205650de29623394e6b2f1706d7ad6b300..8ea70252fb78e9675ca5f74b4343799fe27cffb7 100644 (file)
@@ -787,7 +787,7 @@ static bool generate(private_x509_crl_t *this, certificate_t *cert,
                                                        asn1_wrap(ASN1_SEQUENCE, "m", certList),
                                                        extensions);
 
-       if (!key->sign(key, signature_scheme_from_oid(this->algorithm),
+       if (!key->sign(key, signature_scheme_from_oid(this->algorithm), NULL,
                                   this->tbsCertList, &this->signature))
        {
                return FALSE;
index aef76af326c7a6a56d7d12533809c6541fca14d3..de2ad9878d0dfa98778966c8150ac0a63860e059 100644 (file)
@@ -276,7 +276,7 @@ static chunk_t build_optionalSignature(private_x509_ocsp_request_t *this,
                        return chunk_empty;
        }
 
-       if (!this->key->sign(this->key, scheme, tbsRequest, &signature))
+       if (!this->key->sign(this->key, scheme, NULL, tbsRequest, &signature))
        {
                DBG1(DBG_LIB, "creating OCSP signature failed, skipped");
                return chunk_empty;
index 54555417267a84906bd91c561679f1ff605dbf38..beeb436abe77ccd8755458b7f8a4341a5d813533 100644 (file)
@@ -584,7 +584,7 @@ static bool generate(private_x509_pkcs10_t *cert, private_key_t *sign_key,
                                                        key_info,
                                                        attributes);
 
-       if (!sign_key->sign(sign_key, scheme, cert->certificationRequestInfo,
+       if (!sign_key->sign(sign_key, scheme, NULL, cert->certificationRequestInfo,
                                                &cert->signature))
        {
                return FALSE;
index d30d87ecf0f1d549b7c5e79980a87f41d23544ef..6edae81aee3f1ab60538252a6a1af94da4d46a60 100644 (file)
@@ -57,7 +57,7 @@ static void test_good_sig(private_key_t *privkey, public_key_t *pubkey)
                {
                        continue;
                }
-               fail_unless(privkey->sign(privkey, schemes[i].scheme, data, &sig),
+               fail_unless(privkey->sign(privkey, schemes[i].scheme, NULL, data, &sig),
                                        "sign %N", signature_scheme_names, schemes[i].scheme);
                fail_unless(pubkey->verify(pubkey, schemes[i].scheme, NULL, data, sig),
                                        "verify %N", signature_scheme_names, schemes[i].scheme);
index 6fbec126d5998841e1907b654524a95d1a8479ac..86cbb1bc036bb14589809a2a1fb87f4713fe2aa1 100644 (file)
@@ -297,7 +297,7 @@ START_TEST(test_ed25519_sign)
        ck_assert(public->equals(public, pubkey));
 
        /* sign */
-       ck_assert(key->sign(key, SIGN_ED25519, sig_tests[_i].msg, &sig));
+       ck_assert(key->sign(key, SIGN_ED25519, NULL, sig_tests[_i].msg, &sig));
        ck_assert(sig.len == 64);
        ck_assert(chunk_equals(sig, sig_tests[_i].sig));
 
@@ -340,10 +340,10 @@ START_TEST(test_ed25519_gen)
        ck_assert(!key->decrypt(key, ENCRYPT_UNKNOWN, msg, NULL));
 
        /* wrong signature scheme */
-       ck_assert(!key->sign(key, SIGN_ED448, msg, &sig));
+       ck_assert(!key->sign(key, SIGN_ED448, NULL, msg, &sig));
 
        /* correct signature scheme*/
-       ck_assert(key->sign(key, SIGN_ED25519, msg, &sig));
+       ck_assert(key->sign(key, SIGN_ED25519, NULL, msg, &sig));
 
        /* export public key */
        pubkey = key->get_public_key(key);
@@ -404,7 +404,7 @@ START_TEST(test_ed25519_speed)
                key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_ED25519,
                                                                 BUILD_KEY_SIZE, 256, BUILD_END);
                ck_assert(key != NULL);
-               ck_assert(key->sign(key, SIGN_ED25519, msg, &sig));
+               ck_assert(key->sign(key, SIGN_ED25519, NULL, msg, &sig));
                pubkey = key->get_public_key(key);
                ck_assert(pubkey != NULL);
                ck_assert(pubkey->verify(pubkey, SIGN_ED25519, NULL, msg, sig));
index a1559802d80d40a1e31937bd97ad375744798aae..07a731068dcae462fba6a69017f92552a580c3d0 100644 (file)
@@ -47,7 +47,7 @@ static void test_good_sig(private_key_t *privkey, public_key_t *pubkey)
                {
                        continue;
                }
-               fail_unless(privkey->sign(privkey, schemes[i], data, &sig),
+               fail_unless(privkey->sign(privkey, schemes[i], NULL, data, &sig),
                                        "sign %N", signature_scheme_names, schemes[i]);
                fail_unless(pubkey->verify(pubkey, schemes[i], NULL, data, sig),
                                        "verify %N", signature_scheme_names, schemes[i]);
index 29af5d978c395eab8922cace68b363d6655ca9db..7f7742e88ab4082c5bf64bbe7eaf691e2700d62c 100644 (file)
@@ -1428,7 +1428,7 @@ METHOD(tls_crypto_t, sign, bool,
                        {
                                scheme = hashsig_to_scheme(key->get_type(key), hash, alg);
                                if (scheme != SIGN_UNKNOWN &&
-                                       key->sign(key, scheme, data, &sig))
+                                       key->sign(key, scheme, NULL, data, &sig))
                                {
                                        done = TRUE;
                                        break;
@@ -1460,7 +1460,8 @@ METHOD(tls_crypto_t, sign, bool,
                                {
                                        return FALSE;
                                }
-                               done = key->sign(key, SIGN_RSA_EMSA_PKCS1_NULL, hash, &sig);
+                               done = key->sign(key, SIGN_RSA_EMSA_PKCS1_NULL, NULL, hash,
+                                                                &sig);
                                free(hash.ptr);
                                if (!done)
                                {
@@ -1469,7 +1470,7 @@ METHOD(tls_crypto_t, sign, bool,
                                DBG2(DBG_TLS, "created signature with MD5+SHA1/RSA");
                                break;
                        case KEY_ECDSA:
-                               if (!key->sign(key, SIGN_ECDSA_WITH_SHA1_DER, data, &sig))
+                               if (!key->sign(key, SIGN_ECDSA_WITH_SHA1_DER, NULL, data, &sig))
                                {
                                        return FALSE;
                                }
index bd5a8baebacbe52900e52d4698f22c89ed743877..0df5ee94c98a2f25ef70f13f41cda8499aa30d15 100644 (file)
@@ -76,7 +76,7 @@ METHOD(private_key_t, get_keysize, int,
 }
 
 METHOD(private_key_t, sign, bool,
-       private_tpm_private_key_t *this, signature_scheme_t scheme,
+       private_tpm_private_key_t *this, signature_scheme_t scheme, void *params,
        chunk_t data, chunk_t *signature)
 {
        chunk_t pin = chunk_empty;
@@ -191,7 +191,7 @@ tpm_private_key_t *tpm_private_key_connect(key_type_t type, va_list args)
        if (!tpm)
        {
                DBG1(DBG_LIB, "no TPM 2.0 found");
-               return NULL;    
+               return NULL;
        }
 
        INIT(this,