/************************************************* * PBKDF1 Source File * * (C) 1999-2007 Jack Lloyd * *************************************************/ #include #include #include namespace Botan { /************************************************* * Return a PKCS#5 PBKDF1 derived key * *************************************************/ OctetString PKCS5_PBKDF1::derive(u32bit key_len, const std::string& passphrase, const byte salt[], u32bit salt_size, u32bit iterations) const { if(iterations == 0) throw Invalid_Argument("PKCS#5 PBKDF1: Invalid iteration count"); std::auto_ptr hash(get_hash(hash_name)); if(key_len > hash->OUTPUT_LENGTH) throw Exception("PKCS#5 PBKDF1: Requested output length too long"); hash->update(passphrase); hash->update(salt, salt_size); SecureVector key = hash->final(); for(u32bit j = 1; j != iterations; ++j) { hash->update(key); hash->final(key); } return OctetString(key, std::min(key_len, key.size())); } /************************************************* * Return the name of this type * *************************************************/ std::string PKCS5_PBKDF1::name() const { return "PBKDF1(" + hash_name + ")"; } /************************************************* * PKCS5_PBKDF1 Constructor * *************************************************/ PKCS5_PBKDF1::PKCS5_PBKDF1(const std::string& h_name) : hash_name(h_name) { if(!have_hash(hash_name)) throw Algorithm_Not_Found(hash_name); } }