/* * Modified key schedule used for bcrypt password hashing */ void Blowfish::eks_key_schedule(const byte key[], size_t length, const byte salt[16], size_t workfactor) { if(length == 0 || length >= 56) throw Invalid_Key_Length("EKSBlowfish", length); if(workfactor == 0) throw std::invalid_argument("Bcrypt work factor must be at least 1"); /* * On a 2.8 GHz Core-i7, workfactor == 18 takes about 25 seconds to * hash a password. This seems like a reasonable upper bound for the * time being. */ if(workfactor > 18) throw std::invalid_argument("Requested Bcrypt work factor too large"); clear(); const byte null_salt[16] = { 0 }; key_expansion(key, length, salt); const size_t rounds = 1 << workfactor; for(size_t r = 0; r != rounds; ++r) { key_expansion(key, length, null_salt); key_expansion(salt, 16, null_salt); } }
void XTS_Mode::key_schedule(const uint8_t key[], size_t length) { const size_t key_half = length / 2; if(length % 2 == 1 || !m_cipher->valid_keylength(key_half)) throw Invalid_Key_Length(name(), length); m_cipher->set_key(key, key_half); m_tweak_cipher->set_key(&key[key_half], key_half); }
void XTS_Decryption::set_key(const SymmetricKey& key) { u32bit key_half = key.length() / 2; if(key.length() % 2 == 1 || !cipher->valid_keylength(key_half)) throw Invalid_Key_Length(name(), key.length()); cipher->set_key(key.begin(), key_half); cipher2->set_key(key.begin() + key_half, key_half); }
/** * AES Constructor */ AES::AES(u32bit key_size) : BlockCipher(16, key_size) { if(key_size != 16 && key_size != 24 && key_size != 32) throw Invalid_Key_Length(name(), key_size); ROUNDS = (key_size / 4) + 6; }