|
@@ -1074,7 +1074,24 @@ crypto_cipher_set_key(crypto_cipher_env_t *env, const char *key)
|
|
|
return -1;
|
|
|
|
|
|
memcpy(env->key, key, CIPHER_KEY_LEN);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/** DOCDOC */
|
|
|
+void
|
|
|
+crypto_cipher_generate_iv(char *iv_out)
|
|
|
+{
|
|
|
+ /* XXXX020 It's possible we want to get fancier here. */
|
|
|
+ crypto_rand(iv_out, CIPHER_IV_LEN);
|
|
|
+}
|
|
|
|
|
|
+/** DOCDOC */
|
|
|
+int
|
|
|
+crypto_cipher_set_iv(crypto_cipher_env_t *env, const char *iv)
|
|
|
+{
|
|
|
+ tor_assert(env);
|
|
|
+ tor_assert(iv);
|
|
|
+ aes_set_iv(env->cipher, iv);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1144,8 +1161,67 @@ crypto_cipher_decrypt(crypto_cipher_env_t *env, char *to,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#define AES_CIPHER_BLOCK_SIZE 16
|
|
|
|
|
|
+/** Encrypt <b>fromlen</b> bytes (at least 1) from <b>from</b> with the key in
|
|
|
+ * <b>cipher</b> to the buffer in <b>to</b> of length
|
|
|
+ * <b>tolen</b>. <b>tolen</b> must be at least <b>fromlen</b> plus
|
|
|
+ * CIPHER_IV_LEN bytes for the initialization vector. On success, return the
|
|
|
+ * number of bytes written, on failure, return -1.
|
|
|
+ *
|
|
|
+ * This function adjusts the current position of the counter in <b>cipher</b>
|
|
|
+ * to immediately after the encrypted data.
|
|
|
+ */
|
|
|
+int
|
|
|
+crypto_cipher_encrypt_with_iv(crypto_cipher_env_t *cipher,
|
|
|
+ char *to, size_t tolen,
|
|
|
+ const char *from, size_t fromlen)
|
|
|
+{
|
|
|
+ tor_assert(cipher);
|
|
|
+ tor_assert(from);
|
|
|
+ tor_assert(to);
|
|
|
+
|
|
|
+ if (tolen < fromlen + CIPHER_IV_LEN)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ crypto_cipher_generate_iv(to);
|
|
|
+ if (crypto_cipher_set_iv(cipher, to)<0)
|
|
|
+ return -1;
|
|
|
+ crypto_cipher_encrypt(cipher, to+CIPHER_IV_LEN, from, fromlen);
|
|
|
+ crypto_free_cipher_env(cipher);
|
|
|
+ return fromlen + CIPHER_IV_LEN;
|
|
|
+}
|
|
|
+
|
|
|
+/** Encrypt <b>fromlen</b> bytes (at least 1+CIPHER_IV_LEN) from <b>from</b>
|
|
|
+ * with the key in <b>cipher</b> to the buffer in <b>to</b> of length
|
|
|
+ * <b>tolen</b>. <b>tolen</b> must be at least <b>fromlen</b> minus
|
|
|
+ * CIPHER_IV_LEN bytes for the initialization vector. On success, return the
|
|
|
+ * number of bytes written, on failure, return -1.
|
|
|
+ *
|
|
|
+ * This function adjusts the current position of the counter in <b>cipher</b>
|
|
|
+ * to immediately after the decrypted data.
|
|
|
+ */
|
|
|
+int
|
|
|
+crypto_cipher_decrypt_with_iv(crypto_cipher_env_t *cipher,
|
|
|
+ char *to, size_t tolen,
|
|
|
+ const char *from, size_t fromlen)
|
|
|
+{
|
|
|
+ tor_assert(cipher);
|
|
|
+ tor_assert(from);
|
|
|
+ tor_assert(to);
|
|
|
+
|
|
|
+ if (fromlen < CIPHER_IV_LEN)
|
|
|
+ return -1;
|
|
|
+ if (tolen < fromlen - CIPHER_IV_LEN)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (crypto_cipher_set_iv(cipher, from)<0)
|
|
|
+ return -1;
|
|
|
+ crypto_cipher_encrypt(cipher, to, from+CIPHER_IV_LEN, fromlen-CIPHER_IV_LEN);
|
|
|
+ crypto_free_cipher_env(cipher);
|
|
|
+ return fromlen - CIPHER_IV_LEN;
|
|
|
+}
|
|
|
+
|
|
|
+#define AES_CIPHER_BLOCK_SIZE 16
|
|
|
#define AES_IV_SIZE 16
|
|
|
|
|
|
/** Encrypt <b>fromlen</b> bytes (at least 1) from <b>from</b> with the
|