]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
(test_cipher_gcm): New function, contributed by Nikos
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 5 Feb 2011 22:47:11 +0000 (23:47 +0100)
committerNiels Möller <nisse@lysator.liu.se>
Sat, 5 Feb 2011 22:47:11 +0000 (23:47 +0100)
Mavrogiannopoulos.

Rev: nettle/testsuite/testutils.c:1.12
Rev: nettle/testsuite/testutils.h:1.6

testsuite/testutils.c
testsuite/testutils.h

index a0b3924b8f124a966b8a86b7113c48fd83366463..3228cb73484dde5e055968b5b34e6b93997cba69 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "cbc.h"
 #include "ctr.h"
+#include "gcm.h"
 #include "knuth-lfib.h"
 
 #include <ctype.h>
@@ -295,6 +296,71 @@ test_cipher_ctr(const struct nettle_cipher *cipher,
   free(ctr);
 }
 
+void
+test_cipher_gcm(const struct nettle_cipher *cipher,
+               unsigned key_length,
+               const uint8_t *key,
+               unsigned auth_length,
+               const uint8_t *authtext,
+               unsigned length,
+               const uint8_t *cleartext,
+               const uint8_t *ciphertext,
+               unsigned iv_length,
+               const uint8_t *iv,
+               const uint8_t *digest)
+{
+  struct gcm_ctx gctx;
+  void *cipher_ctx = xalloc(cipher->context_size);
+  uint8_t *data = xalloc(length);
+  uint8_t buffer[GCM_BLOCK_SIZE];
+
+  /* encryption */
+  memset(buffer, 0, sizeof(buffer));
+  cipher->set_encrypt_key(cipher_ctx, key_length, key);
+
+  gcm_set_key(&gctx, cipher_ctx, cipher->encrypt);
+  gcm_set_iv(&gctx, iv_length, iv);
+
+  if (auth_length)
+    gcm_auth(&gctx, auth_length, authtext);
+    
+  if (length)
+    gcm_encrypt(&gctx, cipher_ctx, cipher->encrypt,
+               length, data, cleartext);
+
+  gcm_digest(&gctx, cipher_ctx, cipher->encrypt,
+            GCM_BLOCK_SIZE, buffer);
+
+  if (!MEMEQ(length, data, ciphertext))
+    FAIL();
+
+  if (!MEMEQ(GCM_BLOCK_SIZE, buffer, digest))
+    FAIL();
+
+  /* decryption */
+  memset(buffer, 0, sizeof(buffer));
+  gcm_set_iv(&gctx, iv_length, iv);
+
+  if (auth_length)
+    gcm_auth(&gctx, auth_length, authtext);
+    
+  if (length)
+    gcm_decrypt(&gctx, cipher_ctx, cipher->encrypt,
+               length, data, data);
+
+  gcm_digest(&gctx, cipher_ctx, cipher->encrypt,
+            GCM_BLOCK_SIZE, buffer);
+
+  if (!MEMEQ(length, data, cleartext))
+    FAIL();
+
+  if (!MEMEQ(GCM_BLOCK_SIZE, buffer, digest))
+    FAIL();
+
+  free(cipher_ctx);
+  free(data);
+}
+
 void
 test_cipher_stream(const struct nettle_cipher *cipher,
                   unsigned key_length,
index 91ec49621cf97d9aeb339928181fbfde4060e3c6..bbfa468dda497f9d01ba895722c04375efca4838 100644 (file)
@@ -105,6 +105,19 @@ test_cipher_ctr(const struct nettle_cipher *cipher,
                const uint8_t *ciphertext,
                const uint8_t *iv);
 
+void
+test_cipher_gcm(const struct nettle_cipher *cipher,
+               unsigned key_length,
+               const uint8_t *key,
+               unsigned auth_length,
+               const uint8_t *authtext,
+               unsigned length,
+               const uint8_t *cleartext,
+               const uint8_t *ciphertext,
+               unsigned iv_length,
+               const uint8_t *iv,
+               const uint8_t *digest);
+
 void
 test_cipher_stream(const struct nettle_cipher *cipher,
                   unsigned key_length,