#
# patch "ChangeLog"
# from [9d857a699b70895a42dc76d561ab837889981eda]
# to [a8f0f6c5ccc10b4f16e1776741a2ed08326fdd34]
#
# patch "botan/pkcs8.cpp"
# from [5c5d8888a1684115f03a2532e0bb0a50af58ea73]
# to [6d12f636a9d038c815ba1a19ed4b5dafa2f4a052]
#
========================================================================
--- ChangeLog 9d857a699b70895a42dc76d561ab837889981eda
+++ ChangeLog a8f0f6c5ccc10b4f16e1776741a2ed08326fdd34
@@ -1,5 +1,10 @@
2005-09-16 Matt Johnston
+ * botan/pkcs8.cpp: re-add the monotone-specific code for guessing if
+ a key is DER encoded or not.
+
+2005-09-16 Matt Johnston
+
* botan/*: update to Botan 1.4.6
* Makefile.am: ditto
========================================================================
--- botan/pkcs8.cpp 5c5d8888a1684115f03a2532e0bb0a50af58ea73
+++ botan/pkcs8.cpp 6d12f636a9d038c815ba1a19ed4b5dafa2f4a052
@@ -18,7 +18,50 @@
namespace {
+/* XXX this is monotone specific XXX */
/*************************************************
+* Get info from an RAW_BER pkcs8 key. *
+* Whether it is encrypted will be determined, *
+* returned in is_encrypted. *
+*************************************************/
+SecureVector PKCS8_maybe_enc_extract(DataSource& source,
+ AlgorithmIdentifier& alg_id,
+ bool& is_encrypted)
+ {
+ SecureVector enc_pkcs8_key;
+ u32bit version = 0;
+
+ is_encrypted = false;
+ try {
+ BER_Decoder decoder(source);
+ BER_Decoder sequence = BER::get_subsequence(decoder);
+
+ try {
+ BER::decode(sequence, version);
+ }
+ catch(Decoding_Error) {
+ is_encrypted = true;
+ }
+
+ BER::decode(sequence, alg_id);
+ BER::decode(sequence, enc_pkcs8_key, OCTET_STRING);
+ if (is_encrypted)
+ sequence.discard_remaining();
+ sequence.verify_end();
+ }
+ catch(Decoding_Error)
+ {
+ throw PKCS8_Exception("Private key decoding failed");
+ }
+
+ if (version != 0)
+ throw Decoding_Error("PKCS #8: Unknown version number");
+
+
+ return enc_pkcs8_key;
+ }
+
+/*************************************************
* Get info from an EncryptedPrivateKeyInfo *
*************************************************/
SecureVector PKCS8_extract(DataSource& source,
@@ -53,7 +96,16 @@
try {
if(BER::maybe_BER(source) && !PEM_Code::matches(source))
- key_data = PKCS8_extract(source, pbe_alg_id);
+ {
+ key_data = PKCS8_maybe_enc_extract(source, pbe_alg_id, is_encrypted);
+ if(key_data.is_empty())
+ throw Decoding_Error("PKCS #8 private key decoding failed");
+ if(!is_encrypted)
+ {
+ pk_alg_id = pbe_alg_id;
+ return key_data; // just plain unencrypted BER
+ }
+ }
else
{
std::string label;
@@ -80,12 +132,11 @@
if(!is_encrypted)
key = key_data;
- const u32bit max_tries = Config::get_u32bit("base/pkcs8_tries");
u32bit tries = 0;
while(true)
{
try {
- if(max_tries && tries >= max_tries)
+ if(tries >= Config::get_u32bit("base/pkcs8_tries"))
break;
if(is_encrypted)