AEAD interface.

This change adds an AEAD interface to EVP and an AES-GCM implementation
suitable for use in TLS.
diff --git a/crypto/cipher/internal.h b/crypto/cipher/internal.h
index 1edc059..d46a9e6 100644
--- a/crypto/cipher/internal.h
+++ b/crypto/cipher/internal.h
@@ -106,6 +106,30 @@
 #define EVP_CIPH_MODE_MASK 0x3f
 
 
+struct evp_aead_ctx_st;
+
+/* EVP_AEAD represents a specific AEAD algorithm. */
+struct evp_aead_st {
+  uint8_t key_len;
+  uint8_t nonce_len;
+  uint8_t overhead;
+  uint8_t max_tag_len;
+
+  int (*init)(struct evp_aead_ctx_st *, const uint8_t *key,
+              size_t key_len, size_t tag_len);
+  void (*cleanup)(struct evp_aead_ctx_st *);
+
+  int (*seal)(const struct evp_aead_ctx_st *ctx, uint8_t *out,
+              size_t *out_len, size_t max_out_len, const uint8_t *nonce,
+              size_t nonce_len, const uint8_t *in, size_t in_len,
+              const uint8_t *ad, size_t ad_len);
+
+  int (*open)(const struct evp_aead_ctx_st *ctx, uint8_t *out,
+              size_t *out_len, size_t max_out_len, const uint8_t *nonce,
+              size_t nonce_len, const uint8_t *in, size_t in_len,
+              const uint8_t *ad, size_t ad_len);
+};
+
 #if defined(__cplusplus)
 } /* extern C */
 #endif