52 store_be(CRYPTOBOX_VERSION_CODE, out_buf.data());
53 rng.
randomize(&out_buf[VERSION_CODE_LEN], PBKDF_SALT_LEN);
56 copy_mem(&out_buf[CRYPTOBOX_HEADER_LEN], input, input_len);
62 auto pbkdf = pbkdf_fam->from_params(PBKDF_ITERATIONS);
66 pbkdf->derive_key(master_key.data(),
70 &out_buf[VERSION_CODE_LEN],
73 const uint8_t* mk = master_key.data();
74 const uint8_t* cipher_key = mk;
75 const uint8_t* mac_key = mk + CIPHER_KEY_LEN;
76 const uint8_t* iv = mk + CIPHER_KEY_LEN + MAC_KEY_LEN;
80 ctr->set_key(cipher_key, CIPHER_KEY_LEN);
81 ctr->start(iv, CIPHER_IV_LEN);
82 ctr->finish(out_buf, CRYPTOBOX_HEADER_LEN);
85 hmac->set_key(mac_key, MAC_KEY_LEN);
87 hmac->update(&out_buf[CRYPTOBOX_HEADER_LEN], input_len);
92 copy_mem(&out_buf[VERSION_CODE_LEN + PBKDF_SALT_LEN], mac.data(), MAC_OUTPUT_LEN);
101 if(ciphertext.size() < CRYPTOBOX_HEADER_LEN) {
105 for(
size_t i = 0; i != VERSION_CODE_LEN; ++i) {
107 if(version != CRYPTOBOX_VERSION_CODE) {
112 const uint8_t* pbkdf_salt = &ciphertext[VERSION_CODE_LEN];
113 const uint8_t* box_mac = &ciphertext[VERSION_CODE_LEN + PBKDF_SALT_LEN];
116 auto pbkdf = pbkdf_fam->from_params(PBKDF_ITERATIONS);
121 master_key.data(), master_key.size(), passphrase.data(), passphrase.size(), pbkdf_salt, PBKDF_SALT_LEN);
123 const uint8_t* mk = master_key.data();
124 const uint8_t* cipher_key = mk;
125 const uint8_t* mac_key = mk + CIPHER_KEY_LEN;
126 const uint8_t* iv = mk + CIPHER_KEY_LEN + MAC_KEY_LEN;
130 hmac->set_key(mac_key, MAC_KEY_LEN);
132 if(ciphertext.size() > CRYPTOBOX_HEADER_LEN) {
133 hmac->update(&ciphertext[CRYPTOBOX_HEADER_LEN], ciphertext.size() - CRYPTOBOX_HEADER_LEN);
137 if(!
CT::is_equal(computed_mac.data(), box_mac, MAC_OUTPUT_LEN).as_bool()) {
142 ctr->set_key(cipher_key, CIPHER_KEY_LEN);
143 ctr->start(iv, CIPHER_IV_LEN);
144 ctr->finish(ciphertext, CRYPTOBOX_HEADER_LEN);
146 ciphertext.erase(ciphertext.begin(), ciphertext.begin() + CRYPTOBOX_HEADER_LEN);