1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/*************************************************
* IF Scheme Source File *
* (C) 1999-2005 The Botan Project *
*************************************************/
#include <botan/if_algo.h>
#include <botan/numthry.h>
#include <botan/asn1.h>
namespace Botan {
/*************************************************
* Return the X.509 public key encoding *
*************************************************/
MemoryVector<byte> IF_Scheme_PublicKey::DER_encode_pub() const
{
DER_Encoder encoder;
encoder.start_sequence();
DER::encode(encoder, n);
DER::encode(encoder, e);
encoder.end_sequence();
return encoder.get_contents();
}
/*************************************************
* Return the X.509 parameters encoding *
*************************************************/
MemoryVector<byte> IF_Scheme_PublicKey::DER_encode_params() const
{
DER_Encoder encoder;
DER::encode_null(encoder);
return encoder.get_contents();
}
/*************************************************
* Decode X.509 public key encoding *
*************************************************/
void IF_Scheme_PublicKey::BER_decode_pub(DataSource& source)
{
BER_Decoder decoder(source);
BER_Decoder sequence = BER::get_subsequence(decoder);
BER::decode(sequence, n);
BER::decode(sequence, e);
sequence.verify_end();
X509_load_hook();
}
/*************************************************
* Decode X.509 algorithm parameters *
*************************************************/
void IF_Scheme_PublicKey::BER_decode_params(DataSource& source)
{
byte dummy = 0;
while(!source.end_of_data())
source.read_byte(dummy);
}
/*************************************************
* Return the PKCS #1 private key encoding *
*************************************************/
SecureVector<byte> IF_Scheme_PrivateKey::DER_encode_priv() const
{
DER_Encoder encoder;
encoder.start_sequence();
DER::encode(encoder, 0);
DER::encode(encoder, n);
DER::encode(encoder, e);
DER::encode(encoder, d);
DER::encode(encoder, p);
DER::encode(encoder, q);
DER::encode(encoder, d1);
DER::encode(encoder, d2);
DER::encode(encoder, c);
encoder.end_sequence();
return encoder.get_contents();
}
/*************************************************
* Decode a PKCS #1 private key encoding *
*************************************************/
void IF_Scheme_PrivateKey::BER_decode_priv(DataSource& source)
{
u32bit version;
BER_Decoder decoder(source);
BER_Decoder sequence = BER::get_subsequence(decoder);
BER::decode(sequence, version);
if(version != 0)
throw Decoding_Error(algo_name() + ": Unknown PKCS #1 key version");
BER::decode(sequence, n);
BER::decode(sequence, e);
BER::decode(sequence, d);
BER::decode(sequence, p);
BER::decode(sequence, q);
BER::decode(sequence, d1);
BER::decode(sequence, d2);
BER::decode(sequence, c);
sequence.verify_end();
PKCS8_load_hook();
check_loaded_private();
}
/*************************************************
* Algorithm Specific X.509 Initialization Code *
*************************************************/
void IF_Scheme_PublicKey::X509_load_hook()
{
core = IF_Core(e, n);
check_loaded_public();
}
/*************************************************
* Algorithm Specific PKCS #8 Initialization Code *
*************************************************/
void IF_Scheme_PrivateKey::PKCS8_load_hook()
{
if(n == 0) n = p * q;
if(d1 == 0) d1 = d % (p - 1);
if(d2 == 0) d2 = d % (q - 1);
if(c == 0) c = inverse_mod(q, p);
core = IF_Core(e, n, d, p, q, d1, d2, c);
}
/*************************************************
* Check IF Scheme Public Parameters *
*************************************************/
bool IF_Scheme_PublicKey::check_key(bool) const
{
if(n < 35 || n.is_even() || e < 2)
return false;
return true;
}
/*************************************************
* Check IF Scheme Private Parameters *
*************************************************/
bool IF_Scheme_PrivateKey::check_key(bool strong) const
{
if(n < 35 || n.is_even() || e < 2 || d < 2 || p < 3 || q < 3 || p*q != n)
return false;
if(!strong)
return true;
if(d1 != d % (p - 1) || d2 != d % (q - 1) || c != inverse_mod(q, p))
return false;
if(!check_prime(p) || !check_prime(q))
return false;
return true;
}
}
|