aboutsummaryrefslogtreecommitdiffstats
path: root/checks/pk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'checks/pk.cpp')
-rw-r--r--checks/pk.cpp139
1 files changed, 102 insertions, 37 deletions
diff --git a/checks/pk.cpp b/checks/pk.cpp
index 31c432033..2ebd739d3 100644
--- a/checks/pk.cpp
+++ b/checks/pk.cpp
@@ -6,13 +6,30 @@
#include <memory>
#include <botan/botan.h>
-#include <botan/rsa.h>
-#include <botan/dsa.h>
-#include <botan/dh.h>
-#include <botan/nr.h>
-#include <botan/rw.h>
-#include <botan/elgamal.h>
+#if defined(BOTAN_HAS_RSA)
+ #include <botan/rsa.h>
+#endif
+
+#if defined(BOTAN_HAS_DSA)
+ #include <botan/dsa.h>
+#endif
+
+#if defined(BOTAN_HAS_DH)
+ #include <botan/dh.h>
+#endif
+
+#if defined(BOTAN_HAS_RN)
+ #include <botan/nr.h>
+#endif
+
+#if defined(BOTAN_HAS_RW)
+ #include <botan/rw.h>
+#endif
+
+#if defined(BOTAN_HAS_ELGAMAL)
+ #include <botan/elgamal.h>
+#endif
#if defined(BOTAN_HAS_DLIES)
#include <botan/dlies.h>
@@ -146,6 +163,9 @@ u32bit validate_rsa_enc_pkcs8(const std::string& algo,
if(str.size() != 4 && str.size() != 5)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_RSA)
std::string pass;
if(str.size() == 5) pass = str[4];
strip_newlines(pass); /* it will have a newline thanks to the messy
@@ -154,7 +174,7 @@ u32bit validate_rsa_enc_pkcs8(const std::string& algo,
DataSource_Memory keysource(reinterpret_cast<const byte*>(str[0].c_str()),
str[0].length());
- Private_Key* privkey = PKCS8::load_key(keysource, rng, pass);
+ std::auto_ptr<Private_Key> privkey(PKCS8::load_key(keysource, rng, pass));
RSA_PrivateKey* rsapriv = dynamic_cast<RSA_PrivateKey*>(privkey);
if(!rsapriv)
@@ -167,9 +187,9 @@ u32bit validate_rsa_enc_pkcs8(const std::string& algo,
PK_Encryptor* e = get_pk_encryptor(*rsapub, eme);
PK_Decryptor* d = get_pk_decryptor(*rsapriv, eme);
- bool failure = false;
validate_encryption(e, d, algo, str[1], str[2], str[3], failure);
- delete privkey;
+#endif
+
return (failure ? 1 : 0);
}
@@ -180,6 +200,9 @@ u32bit validate_rsa_enc(const std::string& algo,
if(str.size() != 6)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_RSA)
RSA_PrivateKey privkey(rng,
to_bigint(str[1]), to_bigint(str[2]),
to_bigint(str[0]));
@@ -191,8 +214,9 @@ u32bit validate_rsa_enc(const std::string& algo,
PK_Encryptor* e = get_pk_encryptor(pubkey, eme);
PK_Decryptor* d = get_pk_decryptor(privkey, eme);
- bool failure = false;
validate_encryption(e, d, algo, str[3], str[4], str[5], failure);
+#endif
+
return (failure ? 1 : 0);
}
@@ -203,6 +227,9 @@ u32bit validate_elg_enc(const std::string& algo,
if(str.size() != 6 && str.size() != 7)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_ELGAMAL)
DL_Group domain(to_bigint(str[0]), to_bigint(str[1]));
ElGamal_PrivateKey privkey(rng, domain, to_bigint(str[2]));
ElGamal_PublicKey pubkey = privkey;
@@ -210,7 +237,6 @@ u32bit validate_elg_enc(const std::string& algo,
std::string eme = algo.substr(8, std::string::npos);
PK_Decryptor* d = get_pk_decryptor(privkey, eme);
- bool failure = false;
if(str.size() == 7)
{
@@ -220,6 +246,7 @@ u32bit validate_elg_enc(const std::string& algo,
else
validate_decryption(d, algo, decode_hex(str[5]),
decode_hex(str[4]), failure);
+#endif
return (failure ? 1 : 0);
}
@@ -231,6 +258,9 @@ u32bit validate_rsa_sig(const std::string& algo,
if(str.size() != 6)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_RSA)
RSA_PrivateKey privkey(rng,
to_bigint(str[1]), to_bigint(str[2]),
to_bigint(str[0]));
@@ -241,9 +271,9 @@ u32bit validate_rsa_sig(const std::string& algo,
PK_Verifier* v = get_pk_verifier(pubkey, emsa);
PK_Signer* s = get_pk_signer(privkey, emsa);
-
- bool failure = false;
validate_signature(v, s, algo, str[3], str[4], str[5], failure);
+#endif
+
return (failure ? 1 : 0);
}
@@ -253,18 +283,20 @@ u32bit validate_rsa_ver(const std::string& algo,
if(str.size() != 5) /* is actually 4, parse() adds an extra empty one */
throw Exception("Invalid input from pk_valid.dat");
+ bool passed = true;
+
+#if defined(BOTAN_HAS_RSA)
RSA_PublicKey key(to_bigint(str[1]), to_bigint(str[0]));
std::string emsa = algo.substr(6, std::string::npos);
- PK_Verifier* v = get_pk_verifier(key, emsa);
+ std::auto_ptr<PK_Verifier> v(get_pk_verifier(key, emsa));
SecureVector<byte> msg = decode_hex(str[2]);
SecureVector<byte> sig = decode_hex(str[3]);
- bool passed = v->verify_message(msg, msg.size(), sig, sig.size());
-
- delete v;
+ passed = v->verify_message(msg, msg.size(), sig, sig.size());
+#endif
return (passed ? 0 : 1);
}
@@ -275,10 +307,13 @@ u32bit validate_rsa_ver_x509(const std::string& algo,
if(str.size() != 5) /* is actually 3, parse() adds extra empty ones */
throw Exception("Invalid input from pk_valid.dat");
+ bool passed = true;
+
+#if defined(BOTAN_HAS_RSA)
DataSource_Memory keysource(reinterpret_cast<const byte*>(str[0].c_str()),
str[0].length());
- Public_Key* key = X509::load_key(keysource);
+ std::auto_ptr<Public_Key> key(X509::load_key(keysource));
RSA_PublicKey* rsakey = dynamic_cast<RSA_PublicKey*>(key);
@@ -287,15 +322,13 @@ u32bit validate_rsa_ver_x509(const std::string& algo,
std::string emsa = algo.substr(11, std::string::npos);
- PK_Verifier* v = get_pk_verifier(*rsakey, emsa);
+ std::auto_ptr<PK_Verifier> v(get_pk_verifier(*rsakey, emsa));
SecureVector<byte> msg = decode_hex(str[1]);
SecureVector<byte> sig = decode_hex(str[2]);
- bool passed = v->verify_message(msg, msg.size(), sig, sig.size());
-
- delete v;
- delete key;
+ passed = v->verify_message(msg, msg.size(), sig, sig.size());
+#endif
return (passed ? 0 : 1);
}
@@ -306,18 +339,20 @@ u32bit validate_rw_ver(const std::string& algo,
if(str.size() != 5)
throw Exception("Invalid input from pk_valid.dat");
+ bool passed = true;
+
+#if defined(BOTAN_HAS_RW)
RW_PublicKey key(to_bigint(str[1]), to_bigint(str[0]));
std::string emsa = algo.substr(5, std::string::npos);
- PK_Verifier* v = get_pk_verifier(key, emsa);
+ std::auto_ptr<PK_Verifier> v(get_pk_verifier(key, emsa));
SecureVector<byte> msg = decode_hex(str[2]);
SecureVector<byte> sig = decode_hex(str[3]);
- bool passed = v->verify_message(msg, msg.size(), sig, sig.size());
-
- delete v;
+ passed = v->verify_message(msg, msg.size(), sig, sig.size());
+#endif
return (passed ? 0 : 1);
}
@@ -329,6 +364,9 @@ u32bit validate_rw_sig(const std::string& algo,
if(str.size() != 6)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_RW)
RW_PrivateKey privkey(rng, to_bigint(str[1]), to_bigint(str[2]),
to_bigint(str[0]));
RW_PublicKey pubkey = privkey;
@@ -338,8 +376,9 @@ u32bit validate_rw_sig(const std::string& algo,
PK_Verifier* v = get_pk_verifier(pubkey, emsa);
PK_Signer* s = get_pk_signer(privkey, emsa);
- bool failure = false;
validate_signature(v, s, algo, str[3], str[4], str[5], failure);
+#endif
+
return (failure ? 1 : 0);
}
@@ -355,10 +394,13 @@ u32bit validate_dsa_sig(const std::string& algo,
strip_newlines(pass); /* it will have a newline thanks to the messy
decoding method we use */
+ bool failure = false;
+
+#if defined(BOTAN_HAS_DSA)
DataSource_Memory keysource(reinterpret_cast<const byte*>(str[0].c_str()),
str[0].length());
- Private_Key* privkey = PKCS8::load_key(keysource, rng, pass);
+ std::auto_ptr<Private_Key> privkey(PKCS8::load_key(keysource, rng, pass));
DSA_PrivateKey* dsapriv = dynamic_cast<DSA_PrivateKey*>(privkey);
if(!dsapriv)
@@ -371,9 +413,9 @@ u32bit validate_dsa_sig(const std::string& algo,
PK_Verifier* v = get_pk_verifier(*dsapub, emsa);
PK_Signer* s = get_pk_signer(*dsapriv, emsa);
- bool failure = false;
validate_signature(v, s, algo, str[1], str[2], str[3], failure);
delete privkey;
+#endif
return (failure ? 1 : 0);
}
@@ -387,7 +429,10 @@ u32bit validate_dsa_ver(const std::string& algo,
DataSource_Memory keysource(reinterpret_cast<const byte*>(str[0].c_str()),
str[0].length());
- Public_Key* key = X509::load_key(keysource);
+ bool passed = true;
+
+#if defined(BOTAN_HAS_DSA)
+ std::auto_ptr<Public_Key> key(X509::load_key(keysource));
DSA_PublicKey* dsakey = dynamic_cast<DSA_PublicKey*>(key);
@@ -396,15 +441,14 @@ u32bit validate_dsa_ver(const std::string& algo,
std::string emsa = algo.substr(7, std::string::npos);
- PK_Verifier* v = get_pk_verifier(*dsakey, emsa);
+ std::auto_ptr<PK_Verifier> v(get_pk_verifier(*dsakey, emsa));
SecureVector<byte> msg = decode_hex(str[1]);
SecureVector<byte> sig = decode_hex(str[2]);
v->set_input_format(DER_SEQUENCE);
- bool passed = v->verify_message(msg, msg.size(), sig, sig.size());
- delete v;
- delete key;
+ passed = v->verify_message(msg, msg.size(), sig, sig.size());
+#endif
return (passed ? 0 : 1);
}
@@ -416,6 +460,9 @@ u32bit validate_nr_sig(const std::string& algo,
if(str.size() != 8)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_NR)
DL_Group domain(to_bigint(str[0]), to_bigint(str[1]), to_bigint(str[2]));
NR_PrivateKey privkey(rng, domain, to_bigint(str[4]));
NR_PublicKey pubkey = privkey;
@@ -425,8 +472,9 @@ u32bit validate_nr_sig(const std::string& algo,
PK_Verifier* v = get_pk_verifier(pubkey, emsa);
PK_Signer* s = get_pk_signer(privkey, emsa);
- bool failure = false;
validate_signature(v, s, algo, str[5], str[6], str[7], failure);
+#endif
+
return (failure ? 1 : 0);
}
@@ -437,6 +485,9 @@ u32bit validate_dh(const std::string& algo,
if(str.size() != 5 && str.size() != 6)
throw Exception("Invalid input from pk_valid.dat");
+ bool failure = false;
+
+#if defined(BOTAN_HAS_DH)
DL_Group domain(to_bigint(str[0]), to_bigint(str[1]));
DH_PrivateKey mykey(rng, domain, to_bigint(str[2]));
@@ -450,9 +501,10 @@ u32bit validate_dh(const std::string& algo,
PK_Key_Agreement* kas = get_pk_kas(mykey, kdf);
- bool failure = false;
validate_kas(kas, algo, otherkey.public_value(),
str[4], keylen, failure);
+#endif
+
return (failure ? 1 : 0);
}
@@ -526,24 +578,37 @@ void do_pk_keygen_tests(RandomNumberGenerator& rng)
std::cout << '.' << std::flush; \
}
+#if defined(BOTAN_HAS_RSA)
IF_SIG_KEY(RSA_PrivateKey, 1024);
+#endif
+
+#if defined(BOTAN_HAS_RW)
IF_SIG_KEY(RW_PrivateKey, 1024);
+#endif
+#if defined(BOTAN_HAS_DSA)
DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/512");
DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/768");
DL_SIG_KEY(DSA_PrivateKey, "dsa/jce/1024");
+#endif
+#if defined(BOTAN_HAS_DH)
DL_KEY(DH_PrivateKey, "modp/ietf/768");
DL_KEY(DH_PrivateKey, "modp/ietf/2048");
DL_KEY(DH_PrivateKey, "dsa/jce/1024");
+#endif
+#if defined(BOTAN_HAS_NR)
DL_SIG_KEY(NR_PrivateKey, "dsa/jce/512");
DL_SIG_KEY(NR_PrivateKey, "dsa/jce/768");
DL_SIG_KEY(NR_PrivateKey, "dsa/jce/1024");
+#endif
+#if defined(BOTAN_HAS_ELGAMAL)
DL_ENC_KEY(ElGamal_PrivateKey, "modp/ietf/768");
DL_ENC_KEY(ElGamal_PrivateKey, "modp/ietf/1024");
DL_ENC_KEY(ElGamal_PrivateKey, "dsa/jce/1024");
+#endif
std::cout << std::endl;
}