# # 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)