Imported Upstream version 3.4.11
[platform/upstream/gnutls.git] / lib / accelerated / x86 / aes-gcm-padlock.c
index e1ad566..410cfc0 100644 (file)
  */
 struct gcm_padlock_aes_ctx GCM_CTX(struct padlock_ctx);
 
-static void padlock_aes_encrypt(void *_ctx,
-                               unsigned length, uint8_t * dst,
+static void padlock_aes_encrypt(const void *_ctx,
+                               size_t length, uint8_t * dst,
                                const uint8_t * src)
 {
-       struct padlock_ctx *ctx = _ctx;
+       struct padlock_ctx *ctx = (void*)_ctx;
        struct padlock_cipher_data *pce;
 
        pce = ALIGN16(&ctx->expanded_key);
 
-       padlock_ecb_encrypt(dst, src, pce, length);
+       if (length > 0)
+               padlock_ecb_encrypt(dst, src, pce, length);
 }
 
-static void padlock_aes_set_encrypt_key(struct padlock_ctx *_ctx,
-                                       unsigned length,
+static void padlock_aes128_set_encrypt_key(struct padlock_ctx *_ctx,
                                        const uint8_t * key)
 {
        struct padlock_ctx *ctx = _ctx;
        ctx->enc = 1;
 
-       padlock_aes_cipher_setkey(_ctx, key, length);
+       padlock_aes_cipher_setkey(_ctx, key, 16);
+}
+
+static void padlock_aes256_set_encrypt_key(struct padlock_ctx *_ctx,
+                                       const uint8_t * key)
+{
+       struct padlock_ctx *ctx = _ctx;
+       ctx->enc = 1;
+
+       padlock_aes_cipher_setkey(_ctx, key, 32);
 }
 
 static void aes_gcm_deinit(void *_ctx)
@@ -94,12 +103,17 @@ aes_gcm_cipher_init(gnutls_cipher_algorithm_t algorithm, void **_ctx,
 }
 
 static int
-aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
+aes_gcm_cipher_setkey(void *_ctx, const void *key, size_t keysize)
 {
        struct gcm_padlock_aes_ctx *ctx = _ctx;
 
-       GCM_SET_KEY(ctx, padlock_aes_set_encrypt_key, padlock_aes_encrypt,
-                   keysize, userkey);
+       if (keysize == 16) {
+               GCM_SET_KEY(ctx, padlock_aes128_set_encrypt_key, padlock_aes_encrypt,
+                           key);
+       } else if (keysize == 32) {
+               GCM_SET_KEY(ctx, padlock_aes256_set_encrypt_key, padlock_aes_encrypt,
+                           key);
+       } else abort();
 
        return 0;
 }
@@ -153,12 +167,16 @@ static void aes_gcm_tag(void *_ctx, void *tag, size_t tagsize)
        GCM_DIGEST(ctx, padlock_aes_encrypt, tagsize, tag);
 }
 
+#include "aes-gcm-aead.h"
+
 const gnutls_crypto_cipher_st _gnutls_aes_gcm_padlock = {
        .init = aes_gcm_cipher_init,
        .setkey = aes_gcm_cipher_setkey,
        .setiv = aes_gcm_setiv,
        .encrypt = aes_gcm_encrypt,
        .decrypt = aes_gcm_decrypt,
+       .aead_encrypt = aes_gcm_aead_encrypt,
+       .aead_decrypt = aes_gcm_aead_decrypt,
        .deinit = aes_gcm_deinit,
        .tag = aes_gcm_tag,
        .auth = aes_gcm_auth,