Further separation of CMAC per-message state from subkeys.
[gd/nettle] / examples / nettle-openssl.c
index d497df01c578773d0915b871b36eb3695d3079ad..bb2e6627514aa1502f42585a078999fc57e7765c 100644 (file)
@@ -3,7 +3,7 @@
    Glue that's used only by the benchmark, and subject to change.
 
    Copyright (C) 2002, 2017 Niels Möller
-   Copyright (C) 2017 Daniel P. Berrange
+   Copyright (C) 2017 Red Hat, Inc.
 
    This file is part of GNU Nettle.
 
@@ -79,8 +79,10 @@ openssl_evp_set_encrypt_key(void *p, const uint8_t *key,
                            const EVP_CIPHER *cipher)
 {
   struct openssl_cipher_ctx *ctx = p;
+  int ret;
   ctx->evp = EVP_CIPHER_CTX_new();
-  assert(EVP_EncryptInit_ex(ctx->evp, cipher, NULL, key, NULL) == 1);
+  ret = EVP_CipherInit_ex(ctx->evp, cipher, NULL, key, NULL, 1);
+  assert(ret == 1);
   EVP_CIPHER_CTX_set_padding(ctx->evp, 0);
 }
 static void
@@ -88,8 +90,10 @@ openssl_evp_set_decrypt_key(void *p, const uint8_t *key,
                            const EVP_CIPHER *cipher)
 {
   struct openssl_cipher_ctx *ctx = p;
+  int ret;
   ctx->evp = EVP_CIPHER_CTX_new();
-  assert(EVP_DecryptInit_ex(ctx->evp, cipher, NULL, key, NULL) == 1);
+  ret = EVP_CipherInit_ex(ctx->evp, cipher, NULL, key, NULL, 0);
+  assert(ret == 1);
   EVP_CIPHER_CTX_set_padding(ctx->evp, 0);
 }
 
@@ -99,7 +103,8 @@ openssl_evp_encrypt(const void *p, size_t length,
 {
   const struct openssl_cipher_ctx *ctx = p;
   int len;
-  assert(EVP_EncryptUpdate(ctx->evp, dst, &len, src, length) == 1);
+  int ret = EVP_EncryptUpdate(ctx->evp, dst, &len, src, length);
+  assert(ret == 1);
 }
 static void
 openssl_evp_decrypt(const void *p, size_t length,
@@ -107,7 +112,54 @@ openssl_evp_decrypt(const void *p, size_t length,
 {
   const struct openssl_cipher_ctx *ctx = p;
   int len;
-  assert(EVP_DecryptUpdate(ctx->evp, dst, &len, src, length) == 1);
+  int ret = EVP_DecryptUpdate(ctx->evp, dst, &len, src, length);
+  assert(ret == 1);
+}
+
+static void
+openssl_evp_set_nonce(void *p, const uint8_t *nonce)
+{
+  const struct openssl_cipher_ctx *ctx = p;
+  int ret = EVP_CipherInit_ex(ctx->evp, NULL, NULL, NULL, nonce, -1);
+  assert(ret == 1);
+}
+
+static void
+openssl_evp_update(void *p, size_t length, const uint8_t *src)
+{
+  const struct openssl_cipher_ctx *ctx = p;
+  int len;
+  int ret = EVP_EncryptUpdate(ctx->evp, NULL, &len, src, length);
+  assert(ret == 1);
+}
+
+/* This will work for encryption only! */
+static void
+openssl_evp_gcm_digest(void *p, size_t length, uint8_t *dst)
+{
+  const struct openssl_cipher_ctx *ctx = p;
+  int ret = EVP_CIPHER_CTX_ctrl(ctx->evp, EVP_CTRL_GCM_GET_TAG, length, dst);
+  assert(ret == 1);
+}
+
+static void
+openssl_evp_aead_encrypt(void *p, size_t length,
+                        uint8_t *dst, const uint8_t *src)
+{
+  const struct openssl_cipher_ctx *ctx = p;
+  int len;
+  int ret = EVP_EncryptUpdate(ctx->evp, dst, &len, src, length);
+  assert(ret == 1);
+}
+
+static void
+openssl_evp_aead_decrypt(void *p, size_t length,
+                        uint8_t *dst, const uint8_t *src)
+{
+  const struct openssl_cipher_ctx *ctx = p;
+  int len;
+  int ret = EVP_DecryptUpdate(ctx->evp, dst, &len, src, length);
+  assert(ret == 1);
 }
 
 /* AES */
@@ -175,6 +227,70 @@ nettle_openssl_aes256 = {
   openssl_evp_encrypt, openssl_evp_decrypt
 };
 
+/* AES-GCM */
+static void
+openssl_gcm_aes128_set_encrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_encrypt_key(ctx, key, EVP_aes_128_gcm());
+}
+static void
+openssl_gcm_aes128_set_decrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_decrypt_key(ctx, key, EVP_aes_128_gcm());
+}
+
+static void
+openssl_gcm_aes192_set_encrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_encrypt_key(ctx, key, EVP_aes_192_gcm());
+}
+static void
+openssl_gcm_aes192_set_decrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_decrypt_key(ctx, key, EVP_aes_192_gcm());
+}
+
+static void
+openssl_gcm_aes256_set_encrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_encrypt_key(ctx, key, EVP_aes_256_gcm());
+}
+static void
+openssl_gcm_aes256_set_decrypt_key(void *ctx, const uint8_t *key)
+{
+  openssl_evp_set_decrypt_key(ctx, key, EVP_aes_256_gcm());
+}
+
+const struct nettle_aead
+nettle_openssl_gcm_aes128 = {
+  "openssl gcm_aes128", sizeof(struct openssl_cipher_ctx),
+  16, 16, 12, 16,
+  openssl_gcm_aes128_set_encrypt_key, openssl_gcm_aes128_set_decrypt_key,
+  openssl_evp_set_nonce, openssl_evp_update,
+  openssl_evp_aead_encrypt, openssl_evp_aead_decrypt,
+  openssl_evp_gcm_digest
+};
+
+const struct nettle_aead
+nettle_openssl_gcm_aes192 = {
+  "openssl gcm_aes192", sizeof(struct openssl_cipher_ctx),
+  16, 24, 12, 16,
+  openssl_gcm_aes192_set_encrypt_key, openssl_gcm_aes192_set_decrypt_key,
+  openssl_evp_set_nonce, openssl_evp_update,
+  openssl_evp_aead_encrypt, openssl_evp_aead_decrypt,
+  openssl_evp_gcm_digest
+};
+
+const struct nettle_aead
+nettle_openssl_gcm_aes256 = {
+  "openssl gcm_aes256", sizeof(struct openssl_cipher_ctx),
+  16, 32, 12, 16,
+  openssl_gcm_aes256_set_encrypt_key, openssl_gcm_aes256_set_decrypt_key,
+  openssl_evp_set_nonce, openssl_evp_update,
+  openssl_evp_aead_encrypt, openssl_evp_aead_decrypt,
+  openssl_evp_gcm_digest
+};
+
 /* Arcfour */
 static void
 openssl_arcfour128_set_encrypt_key(void *ctx, const uint8_t *key)