Botan 3.0.0
Crypto and TLS for C&
keypair.cpp
Go to the documentation of this file.
1/*
2* Keypair Checks
3* (C) 1999-2010 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/internal/keypair.h>
9#include <botan/pubkey.h>
10#include <botan/rng.h>
11
12namespace Botan::KeyPair {
13
14/*
15* Check an encryption key pair for consistency
16*/
18 const Private_Key& private_key,
19 const Public_Key& public_key,
20 std::string_view padding)
21 {
22 PK_Encryptor_EME encryptor(public_key, rng, padding);
23 PK_Decryptor_EME decryptor(private_key, rng, padding);
24
25 /*
26 Weird corner case, if the key is too small to encrypt anything at
27 all. This can happen with very small RSA keys with PSS
28 */
29 if(encryptor.maximum_input_size() == 0)
30 return true;
31
32 std::vector<uint8_t> plaintext;
33 rng.random_vec(plaintext, encryptor.maximum_input_size() - 1);
34
35 std::vector<uint8_t> ciphertext = encryptor.encrypt(plaintext, rng);
36 if(ciphertext == plaintext)
37 return false;
38
39 std::vector<uint8_t> decrypted = unlock(decryptor.decrypt(ciphertext));
40
41 return (plaintext == decrypted);
42 }
43
44/*
45* Check a signature key pair for consistency
46*/
48 const Private_Key& private_key,
49 const Public_Key& public_key,
50 std::string_view padding)
51 {
52 PK_Signer signer(private_key, rng, padding);
53 PK_Verifier verifier(public_key, padding);
54
55 std::vector<uint8_t> message(32);
56 rng.randomize(message.data(), message.size());
57
58 std::vector<uint8_t> signature;
59
60 try
61 {
62 signature = signer.sign_message(message, rng);
63 }
64 catch(Encoding_Error&)
65 {
66 return false;
67 }
68
69 if(!verifier.verify_message(message, signature))
70 return false;
71
72 // Now try to check a corrupt signature, ensure it does not succeed
73 ++signature[0];
74
75 if(verifier.verify_message(message, signature))
76 return false;
77
78 return true;
79 }
80
81}
secure_vector< uint8_t > decrypt(const uint8_t in[], size_t length) const
Definition: pubkey.cpp:20
size_t maximum_input_size() const override
Definition: pubkey.cpp:115
std::vector< uint8_t > encrypt(const uint8_t in[], size_t length, RandomNumberGenerator &rng) const
Definition: pubkey.h:38
std::vector< uint8_t > sign_message(const uint8_t in[], size_t length, RandomNumberGenerator &rng)
Definition: pubkey.h:198
bool verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length)
Definition: pubkey.cpp:385
void randomize(std::span< uint8_t > output)
Definition: rng.h:53
void random_vec(std::span< uint8_t > v)
Definition: rng.h:178
bool signature_consistency_check(RandomNumberGenerator &rng, const Private_Key &private_key, const Public_Key &public_key, std::string_view padding)
Definition: keypair.cpp:47
bool encryption_consistency_check(RandomNumberGenerator &rng, const Private_Key &private_key, const Public_Key &public_key, std::string_view padding)
Definition: keypair.cpp:17
std::vector< T > unlock(const secure_vector< T > &in)
Definition: secmem.h:77