Add stitched RC4-MD5 as an AEAD.

This change adds the stitched RC4-MD5 code from upstream OpenSSL but
exposes it as an AEAD. It's not a normal AEAD (it's stateful thus
doesn't take an nonce) but forcing pre-AEAD cipher suites in the AEAD
interface is less painful than forcing AEADs into the EVP_CIPHER
interface. Over time, more and more cipher suites will be exposed as
TLS-specific AEADs and then ssl/ can drop support for EVP_CIPHER.

See original code from upstream:
https://github.com/openssl/openssl/blob/master/crypto/evp/e_rc4_hmac_md5.c

Change-Id: Ia9267b224747f02be6b934ea0b2b50e1f529fab9
Reviewed-on: https://boringssl-review.googlesource.com/1043
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/cipher/aead.h b/crypto/cipher/aead.h
index 24e8564..767ab78 100644
--- a/crypto/cipher/aead.h
+++ b/crypto/cipher/aead.h
@@ -102,6 +102,18 @@
 const EVP_AEAD *EVP_aead_chacha20_poly1305();
 
 
+/* TLS specific AEAD algorithms.
+ *
+ * These AEAD primitives do not meet the definition of generic AEADs. They are
+ * all specific to TLS in some fashion and should not be used outside of that
+ * context. */
+
+/* EVP_aead_rc4_md5_tls uses RC4 and HMAC(MD5) in MAC-then-encrypt mode. Unlike
+ * a standard AEAD, this is stateful as the RC4 state is carried from operation
+ * to operation. */
+const EVP_AEAD *EVP_aead_rc4_md5_tls();
+
+
 /* Utility functions. */
 
 /* EVP_AEAD_key_length returns the length, in bytes, of the keys used by
diff --git a/crypto/cipher/aead_test.c b/crypto/cipher/aead_test.c
index 7e40147..516ec31 100644
--- a/crypto/cipher/aead_test.c
+++ b/crypto/cipher/aead_test.c
@@ -104,6 +104,15 @@
     return 0;
   }
 
+  /* The "stateful" AEADs for implementing pre-AEAD cipher suites need to be
+   * reset after each operation. */
+  EVP_AEAD_CTX_cleanup(&ctx);
+  if (!EVP_AEAD_CTX_init(&ctx, aead, bufs[KEY], lengths[KEY], lengths[TAG],
+                         NULL)) {
+    fprintf(stderr, "Failed to init AEAD on line %u\n", line_no);
+    return 0;
+  }
+
   if (!EVP_AEAD_CTX_open(&ctx, out2, &plaintext_len, lengths[IN], bufs[NONCE],
                          lengths[NONCE], out, ciphertext_len, bufs[AD],
                          lengths[AD])) {
@@ -117,6 +126,15 @@
     return 0;
   }
 
+  /* The "stateful" AEADs for implementing pre-AEAD cipher suites need to be
+   * reset after each operation. */
+  EVP_AEAD_CTX_cleanup(&ctx);
+  if (!EVP_AEAD_CTX_init(&ctx, aead, bufs[KEY], lengths[KEY], lengths[TAG],
+                         NULL)) {
+    fprintf(stderr, "Failed to init AEAD on line %u\n", line_no);
+    return 0;
+  }
+
   out[0] ^= 0x80;
   if (EVP_AEAD_CTX_open(&ctx, out2, &plaintext_len, lengths[IN], bufs[NONCE],
                         lengths[NONCE], out, ciphertext_len, bufs[AD],
@@ -148,6 +166,8 @@
     aead = EVP_aead_aes_256_gcm();
   } else if (strcmp(argv[1], "chacha20-poly1305") == 0) {
     aead = EVP_aead_chacha20_poly1305();
+  } else if (strcmp(argv[1], "rc4-md5") == 0) {
+    aead = EVP_aead_rc4_md5_tls();
   } else {
     fprintf(stderr, "Unknown AEAD: %s\n", argv[1]);
     return 2;
diff --git a/crypto/cipher/cipher.h b/crypto/cipher/cipher.h
index 74f08ef..7d25005 100644
--- a/crypto/cipher/cipher.h
+++ b/crypto/cipher/cipher.h
@@ -436,6 +436,9 @@
 #define CIPHER_F_aead_chacha20_poly1305_init 113
 #define CIPHER_F_aead_chacha20_poly1305_open 114
 #define CIPHER_F_aead_chacha20_poly1305_seal 115
+#define CIPHER_F_aead_rc4_md5_tls_init 116
+#define CIPHER_F_aead_rc4_md5_tls_seal 117
+#define CIPHER_F_aead_rc4_md5_tls_open 118
 #define CIPHER_R_WRAP_MODE_NOT_ALLOWED 100
 #define CIPHER_R_AES_KEY_SETUP_FAILED 101
 #define CIPHER_R_INPUT_NOT_INITIALIZED 102
@@ -453,5 +456,7 @@
 #define CIPHER_R_UNSUPPORTED_KEY_SIZE 114
 #define CIPHER_R_TOO_LARGE 115
 #define CIPHER_R_IV_TOO_LARGE 116
+#define CIPHER_R_INVALID_AD_SIZE 117
+#define CIPHER_R_INVALID_AD 118
 
 #endif  /* OPENSSL_HEADER_CIPHER_H */
diff --git a/crypto/cipher/cipher_error.c b/crypto/cipher/cipher_error.c
index ec53f16..295b961 100644
--- a/crypto/cipher/cipher_error.c
+++ b/crypto/cipher/cipher_error.c
@@ -31,6 +31,9 @@
   {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_chacha20_poly1305_init, 0), "aead_chacha20_poly1305_init"},
   {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_chacha20_poly1305_open, 0), "aead_chacha20_poly1305_open"},
   {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_chacha20_poly1305_seal, 0), "aead_chacha20_poly1305_seal"},
+  {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_rc4_md5_tls_init, 0), "aead_rc4_md5_tls_init"},
+  {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_rc4_md5_tls_open, 0), "aead_rc4_md5_tls_open"},
+  {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aead_rc4_md5_tls_seal, 0), "aead_rc4_md5_tls_seal"},
   {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aes_init_key, 0), "aes_init_key"},
   {ERR_PACK(ERR_LIB_CIPHER, CIPHER_F_aesni_init_key, 0), "aesni_init_key"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_AES_KEY_SETUP_FAILED), "AES_KEY_SETUP_FAILED"},
@@ -42,6 +45,8 @@
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH), "DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_INITIALIZATION_ERROR), "INITIALIZATION_ERROR"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_INPUT_NOT_INITIALIZED), "INPUT_NOT_INITIALIZED"},
+  {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_INVALID_AD), "INVALID_AD"},
+  {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_INVALID_AD_SIZE), "INVALID_AD_SIZE"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_IV_TOO_LARGE), "IV_TOO_LARGE"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_NO_CIPHER_SET), "NO_CIPHER_SET"},
   {ERR_PACK(ERR_LIB_CIPHER, 0, CIPHER_R_OUTPUT_ALIASES_INPUT), "OUTPUT_ALIASES_INPUT"},
diff --git a/crypto/cipher/e_rc4.c b/crypto/cipher/e_rc4.c
index 840855a..df1bc11 100644
--- a/crypto/cipher/e_rc4.c
+++ b/crypto/cipher/e_rc4.c
@@ -54,8 +54,14 @@
  * copied and put under another distribution licence
  * [including the GNU Public Licence.] */
 
+#include <openssl/aead.h>
+
+#include <assert.h>
+
 #include <openssl/cipher.h>
+#include <openssl/err.h>
 #include <openssl/md5.h>
+#include <openssl/mem.h>
 #include <openssl/obj.h>
 #include <openssl/rc4.h>
 
@@ -85,3 +91,279 @@
     NULL /* cleanup */,  NULL /* ctrl */, };
 
 const EVP_CIPHER *EVP_rc4(void) { return &rc4; }
+
+
+struct aead_rc4_md5_tls_ctx {
+  RC4_KEY rc4;
+  MD5_CTX head, tail, md;
+  size_t payload_length;
+  unsigned char tag_len;
+};
+
+
+static int
+aead_rc4_md5_tls_init(EVP_AEAD_CTX *ctx, const uint8_t *key, size_t key_len,
+                      size_t tag_len) {
+  struct aead_rc4_md5_tls_ctx *rc4_ctx;
+  size_t i;
+  uint8_t hmac_key[MD5_CBLOCK];
+
+  if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) {
+    tag_len = MD5_DIGEST_LENGTH;
+  }
+
+  if (tag_len > MD5_DIGEST_LENGTH) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_init, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  /* The keys consists of |MD5_DIGEST_LENGTH| bytes of HMAC(MD5) key followed
+   * by some number of bytes of RC4 key. */
+  if (key_len <= MD5_DIGEST_LENGTH) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_init, CIPHER_R_BAD_KEY_LENGTH);
+    return 0;
+  }
+
+  rc4_ctx = OPENSSL_malloc(sizeof(struct aead_rc4_md5_tls_ctx));
+  if (rc4_ctx == NULL) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_init, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  memset(rc4_ctx, 0, sizeof(struct aead_rc4_md5_tls_ctx));
+
+  RC4_set_key(&rc4_ctx->rc4, key_len - MD5_DIGEST_LENGTH,
+              key + MD5_DIGEST_LENGTH);
+
+  memset(hmac_key, 0, sizeof(hmac_key));
+  memcpy(hmac_key, key, MD5_DIGEST_LENGTH);
+  for (i = 0; i < sizeof(hmac_key); i++) {
+    hmac_key[i] ^= 0x36;
+  }
+  MD5_Init(&rc4_ctx->head);
+  MD5_Update(&rc4_ctx->head, hmac_key, sizeof(hmac_key));
+  for (i = 0; i < sizeof(hmac_key); i++) {
+    hmac_key[i] ^= 0x36 ^ 0x5c;
+  }
+  MD5_Init(&rc4_ctx->tail);
+  MD5_Update(&rc4_ctx->tail, hmac_key, sizeof(hmac_key));
+
+  rc4_ctx->tag_len = tag_len;
+  ctx->aead_state = rc4_ctx;
+
+  return 1;
+}
+
+static void aead_rc4_md5_tls_cleanup(EVP_AEAD_CTX *ctx) {
+  struct aead_rc4_md5_tls_ctx *rc4_ctx = ctx->aead_state;
+  OPENSSL_cleanse(rc4_ctx, sizeof(struct aead_rc4_md5_tls_ctx));
+  OPENSSL_free(rc4_ctx);
+}
+
+#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64)
+#define STITCHED_CALL
+
+/* rc4_md5_enc is defined in rc4_md5-x86_64.pl */
+void rc4_md5_enc(RC4_KEY *key, const void *in0, void *out, MD5_CTX *ctx,
+                 const void *inp, size_t blocks);
+#endif
+
+static int aead_rc4_md5_tls_seal(const EVP_AEAD_CTX *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) {
+  struct aead_rc4_md5_tls_ctx *rc4_ctx = ctx->aead_state;
+  MD5_CTX md;
+#if defined(STITCHED_CALL)
+  size_t rc4_off, md5_off, blocks;
+  extern unsigned int OPENSSL_ia32cap_P[];
+#else
+  const size_t rc4_off = 0;
+  const size_t md5_off = 0;
+#endif
+  uint8_t digest[MD5_DIGEST_LENGTH];
+
+  if (in_len + rc4_ctx->tag_len < in_len) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_seal, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  if (nonce_len != 0) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_seal, CIPHER_R_IV_TOO_LARGE);
+    return 0;
+  }
+
+  if (max_out_len < in_len + rc4_ctx->tag_len) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_seal, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  if (nonce_len != 0) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_seal, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  memcpy(&md, &rc4_ctx->head, sizeof(MD5_CTX));
+  /* The MAC's payload begins with the additional data. See
+   * https://tools.ietf.org/html/rfc5246#section-6.2.3.1 */
+  MD5_Update(&md, ad, ad_len);
+
+#if defined(STITCHED_CALL)
+  /* 32 is $MOD from rc4_md5-x86_64.pl. */
+  rc4_off = 32 - 1 - (rc4_ctx->rc4.x & (32 - 1));
+  md5_off = MD5_CBLOCK - md.num;
+  /* Ensure RC4 is behind MD5. */
+  if (rc4_off > md5_off) {
+    md5_off += MD5_CBLOCK;
+  }
+  assert(md5_off >= rc4_off);
+
+  if (in_len > md5_off && (blocks = (in_len - md5_off) / MD5_CBLOCK) &&
+      (OPENSSL_ia32cap_P[0] & (1 << 20)) == 0) {
+    /* Process the initial portions of the plaintext normally. */
+    MD5_Update(&md, in, md5_off);
+    RC4(&rc4_ctx->rc4, rc4_off, in, out);
+
+    /* Process the next |blocks| blocks of plaintext with stitched routines. */
+    rc4_md5_enc(&rc4_ctx->rc4, in + rc4_off, out + rc4_off, &md, in + md5_off,
+                blocks);
+    blocks *= MD5_CBLOCK;
+    rc4_off += blocks;
+    md5_off += blocks;
+    md.Nh += blocks >> 29;
+    md.Nl += blocks <<= 3;
+    if (md.Nl < (unsigned int)blocks) {
+      md.Nh++;
+    }
+  } else {
+    rc4_off = 0;
+    md5_off = 0;
+  }
+#endif
+  /* Finish computing the MAC. */
+  MD5_Update(&md, in + md5_off, in_len - md5_off);
+  MD5_Final(digest, &md);
+
+  memcpy(&md, &rc4_ctx->tail, sizeof(MD5_CTX));
+  MD5_Update(&md, digest, sizeof(digest));
+  if (rc4_ctx->tag_len == MD5_DIGEST_LENGTH) {
+    MD5_Final(out + in_len, &md);
+  } else {
+    MD5_Final(digest, &md);
+    memcpy(out + in_len, digest, rc4_ctx->tag_len);
+  }
+
+  /* Encrypt the remainder of the plaintext and the MAC. */
+  RC4(&rc4_ctx->rc4, in_len - rc4_off, in + rc4_off, out + rc4_off);
+  RC4(&rc4_ctx->rc4, MD5_DIGEST_LENGTH, out + in_len, out + in_len);
+
+  *out_len = in_len + rc4_ctx->tag_len;
+  return 1;
+}
+
+static int aead_rc4_md5_tls_open(const EVP_AEAD_CTX *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) {
+  struct aead_rc4_md5_tls_ctx *rc4_ctx = ctx->aead_state;
+  MD5_CTX md;
+  size_t plaintext_len;
+#if defined(STITCHED_CALL)
+  unsigned int l;
+  size_t rc4_off, md5_off, blocks;
+  extern unsigned int OPENSSL_ia32cap_P[];
+#else
+  const size_t rc4_off = 0;
+  const size_t md5_off = 0;
+#endif
+  uint8_t digest[MD5_DIGEST_LENGTH];
+
+  if (in_len < rc4_ctx->tag_len) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_open, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  plaintext_len = in_len - rc4_ctx->tag_len;
+
+  if (nonce_len != 0) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_seal, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  if (max_out_len < plaintext_len) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_open, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  memcpy(&md, &rc4_ctx->head, sizeof(MD5_CTX));
+  /* The MAC's payload begins with the additional data. See
+   * https://tools.ietf.org/html/rfc5246#section-6.2.3.1 */
+  MD5_Update(&md, ad, ad_len);
+
+#if defined(STITCHED_CALL)
+  rc4_off = 32 - 1 - (rc4_ctx->rc4.x & (32 - 1));
+  md5_off = MD5_CBLOCK - md.num;
+  /* Ensure MD5 is a full block behind RC4 so it has plaintext to operate on in
+   * both normal and stitched routines. */
+  if (md5_off > rc4_off) {
+    rc4_off += 2 * MD5_CBLOCK;
+  } else {
+    rc4_off += MD5_CBLOCK;
+  }
+
+  if (in_len > rc4_off && (blocks = (in_len - rc4_off) / MD5_CBLOCK) &&
+      (OPENSSL_ia32cap_P[0] & (1 << 20)) == 0) {
+    /* Decrypt the initial portion of the ciphertext and digest the plaintext
+     * normally. */
+    RC4(&rc4_ctx->rc4, rc4_off, in, out);
+    MD5_Update(&md, out, md5_off);
+
+    /* Decrypt and digest the next |blocks| blocks of ciphertext with the
+     * stitched routines. */
+    rc4_md5_enc(&rc4_ctx->rc4, in + rc4_off, out + rc4_off, &md, out + md5_off,
+                blocks);
+    blocks *= MD5_CBLOCK;
+    rc4_off += blocks;
+    md5_off += blocks;
+    l = (md.Nl + (blocks << 3)) & 0xffffffffU;
+    if (l < md.Nl) {
+      md.Nh++;
+    }
+    md.Nl = l;
+    md.Nh += blocks >> 29;
+  } else {
+    md5_off = 0;
+    rc4_off = 0;
+  }
+#endif
+
+  /* Process the remainder of the input. */
+  RC4(&rc4_ctx->rc4, in_len - rc4_off, in + rc4_off, out + rc4_off);
+  MD5_Update(&md, out + md5_off, plaintext_len - md5_off);
+  MD5_Final(digest, &md);
+
+  /* Calculate HMAC and verify it */
+  memcpy(&md, &rc4_ctx->tail, sizeof(MD5_CTX));
+  MD5_Update(&md, digest, MD5_DIGEST_LENGTH);
+  MD5_Final(digest, &md);
+
+  if (CRYPTO_memcmp(out + plaintext_len, digest, rc4_ctx->tag_len)) {
+    OPENSSL_PUT_ERROR(CIPHER, aead_rc4_md5_tls_open, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  *out_len = plaintext_len;
+  return 1;
+}
+
+static const EVP_AEAD aead_rc4_md5_tls = {
+    16 + MD5_DIGEST_LENGTH, /* key len (RC4 + MD5) */
+    0,                      /* nonce len */
+    MD5_DIGEST_LENGTH,      /* overhead */
+    MD5_DIGEST_LENGTH,      /* max tag length */
+    aead_rc4_md5_tls_init,  aead_rc4_md5_tls_cleanup,
+    aead_rc4_md5_tls_seal,  aead_rc4_md5_tls_open,
+};
+
+const EVP_AEAD *EVP_aead_rc4_md5_tls() { return &aead_rc4_md5_tls; }
diff --git a/crypto/cipher/rc4_md5_tests.txt b/crypto/cipher/rc4_md5_tests.txt
new file mode 100644
index 0000000..3457e01
--- /dev/null
+++ b/crypto/cipher/rc4_md5_tests.txt
@@ -0,0 +1,480 @@
+# DIGEST: 74e6f7298a9c2d168935f58c001bad88
+KEY: 0000000000000000000000000000000000000000000000000000000000000000
+NONCE:
+IN: 
+AD: 
+CT: 
+TAG: aafe7e6829ab702c0333ebeb57753fe5
+
+# DIGEST: a01f566565c1d4f834c2e56a76a9c043
+KEY: aa53d85eb0dfcb3bd07dcd3004fa1be113a91def46fb2901013fdbf5baf699e5
+NONCE:
+IN: 86493545a2
+AD: 85
+CT: 72f78380c8
+TAG: 4330248161175892f17e4a980bbcff43
+
+# DIGEST: f3b7c67203f43725e504b65a037eb4b2
+KEY: 41f9fb1b926f13e506961cc02be782c1eeead9f72ff10e3cef82bf76bad0b584
+NONCE:
+IN: 86493545a236270a2e85
+AD: 0063
+CT: ca5bae324a04fc9d4b15
+TAG: 282ab44bd95c396bece4e114b64b48cc
+
+# DIGEST: 99c48894c29ac40f8abf20e568676902
+KEY: 729841c4bd9c328a74487072d8101ba52662198c0055c8b7b1c8396b61a157fa
+NONCE:
+IN: 86493545a236270a2e85e5d400587d
+AD: 0304c1
+CT: 927163f9dfb6ca4f324def27c48566
+TAG: 955df12abad3a30a4787b2dc1e740704
+
+# DIGEST: c53e23685235d1665077dace29f95d4e
+KEY: 4f87e3f0c916a85f19bb3b65aece775068c3e0dc9d441968dd6a9e6082cd3eee
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9de
+AD: da8dcaf3
+CT: 1fd74445df3a497993d75e25b4ce82eabd6d5006
+TAG: 02fd1a27475195432ae75ea6c5e005b1
+
+# DIGEST: c85d0a4ee18a67e5453ae841af29cd83
+KEY: a543a910ed3fa85e1b56a3e76bc20b39ca52c31491174fcea910842778036f34
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656d
+AD: b48cf75efa
+CT: f40cc7da3221fb55f84f263cb830f2f8d2b497660145cbd853
+TAG: b466115486da6b98fa9d5e7ae03abd38
+
+# DIGEST: d2b9320adff730b24e67db4c3d680d2f
+KEY: d5b6b11a04444c9e766683525cf17c82ab59159c059f5e87f18e5b8591be18b8
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba
+AD: 6ce219cf0dd3
+CT: a73ea0123c547345ab785ed4c13aea51c088e17f36632773cb0b32ee6716
+TAG: bf75f7e2297add2ce4107b18d141ef41
+
+# DIGEST: 1469d60f3c20b52c1d9f9c867ee7e79f
+KEY: 6438a3ccb84add6df57dd3d820ab53d0d645f15d6cd0f35ce4cdf9b39a484521
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1
+AD: 35461ed91f20fb
+CT: 4862c06ee41fa1274037a77158440d0a9e832b12b73759a01358c4216fe8dd8d0156a1
+TAG: c2120a8197294dd17318ecd2d5bf1cd7
+
+# DIGEST: 3cc27dd622cfa3d309b95a39f9c53576
+KEY: ffd6ef1187b1279bce84e584e43a0296928b8f4bb3e1b70ed3e72068f9d8602d
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3
+AD: 613a875cd3b168f3
+CT: 0b017cac4af8834f9f8aab1ecf4f983dbde8b70ba7eabbc1a90a489e4ef6609c373ce87b97bb1dbe
+TAG: 1d3c445f9e55ef15735d08663b11cc25
+
+# DIGEST: 1a6f9209e7f4b2f4c8f7c4949fb2b2c1
+KEY: f28ea8c8b7ceccab0010a1a0a204433a2cea712295fd2e12c1cc3509145eef31
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50c
+AD: 185f49cf82606559c0
+CT: c32b83099ab5bc443c3d3bce1504989771116b5f6f33b2bd94b8f820a9f46197b25e827423588428ddfcc904c6
+TAG: d4e0ebd6f510a04286dc44517c66a9d7
+
+# DIGEST: d6b5e7d430dc7ca488d69d31ecd3bcad
+KEY: 948015831df928f74474295e5cb38e6ac68ba534614632c00dbee98d7bd1fe37
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb4
+AD: e1358837ffcd5bd0aa3b
+CT: e03fe463ece108ce9d322838c76501c0b3b5d5a317f2b2e73c08b4d61d7be1bab3dbd0f46af5e1752d0f09e24a640c239562
+TAG: eb112825b56b805650484fe0ace2b768
+
+# DIGEST: fe27a9e589df986c6c8b295144cac138
+KEY: bcf01382d627dc8936c4a65e09b58f62fb11eca813ae4be8a0b5811994ebbc0e
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bc
+AD: 0800ddfa91e43e67e27822
+CT: 5c495392f21180c3b6a2b71954a0aa27b2c17ebe33741be7519e6746833cd81e805c97bef0bbe5d18654423aa6d459447593f2d1bbce49
+TAG: f1ce5970d608d5bdaa5709d5b5bb0c43
+
+# DIGEST: 2c2ee416066fb9e2e3e9bceb819ad563
+KEY: 217d9516684be841c88dd7fbd5ee27fb92cf6b36a73e1715280796e49ef7ca41
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531
+AD: f47485329ec1f033156bf160
+CT: b4ab84dc958a8439f67af8bdfeb2d24271d6f254e640aaa200e38d1fac342d4e701840a9074c39c44682c188e669a04bed02c50d16e76ee1ade1c1a8
+TAG: 59dbc952949b096bd39e4aaf88c8c666
+
+# DIGEST: b55dd0430f2cf35f5129938611f17c84
+KEY: 3dc424cfb6869b5ee43a987f0682cde94820a838d3e33dc7944cc67c18488714
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da39739
+AD: 0bc1b8e25991adce0714f0e232
+CT: e822434469dd0f274a160de2ab4cb27ffd5c43bfe534735045d7ac4b0627a4ae0639349d5381324c888388a7d465949cf3eba2cea4e27db4beff7761b4df26484f
+TAG: c56bc3b11b8106fd6037b7dd23990cec
+
+# DIGEST: 9a1b99d84d64ad2f1ef223b6b3f20974
+KEY: 503bd7be3c68c5deac5997a08721e26b6b24639147d4a0dfc0c601d61c44b84c
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4
+AD: fcbdd1adf5a5e20cb6eb605ed929
+CT: f33ecc6ebf083f0a5e793fbbe7f521397946b3ad11041298ce7a400001c85ae8c6e0946ba342c82b077a20d3ffbc1ad77a9b0eefb60c491c5fe38973d85de7571c85956b3aaf
+TAG: 25414d57f46efbefab90b8f9d99dfa12
+
+# DIGEST: 1da1743a55e5d69171838668257ede1b
+KEY: 0f7f32641f15945f515adb1b2eec25d880d1f795b48d4f327659d6cac0ba39e4
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75
+AD: 53e1448504f1b5a27f22e455abf8bc
+CT: 8ed4d30f40b4bd7428107573ca1d8451453e75efb46e38cd3c2d1243a5b494e2a3bb7a06fba59dd69f2cf7fc010bbe62e7e9699b284a3882f0a1d5fc770b7fdc2ec68ce41e75a27459f498
+TAG: 7d09d5d1cec7cf2f6c442949749e7c0d
+
+# DIGEST: 827e66aad4cfb90afaaaf27d0d62db31
+KEY: 04ca4f07ad263d4a1388abcc1e139a38303343aa3dc759633b8802ee364140f4
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774
+AD: 4fece1037a606d09a2d11fdf56fc52fe
+CT: 034073700595fe9e33262e2c1a269d4b03c0525660f17058d3eac90f2af9ec1f072e9f5010494c1429192d1253c1873b0e9e99ccbc0bee0f704156bab00c4471c20ef0304a76e347db144fe3ba94a617
+TAG: 7958fc8b4ca13762a6136aad82df52b9
+
+# DIGEST: d67c8b41a750a13c636fdd6fea3c1435
+KEY: 21106c05d5eb5ea9ef097945dec5764cdab78e8cbb9cf48a34178e4e892e9105
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b2042
+AD: fe4f27bd1357854c175cdbab3c5d3bf84d
+CT: a817fd1621029562dce3af429558697f348954ec138c3a3185af0529fc26d849caa42618632f9fd80d2c814431b7d8714532eb64ca3bb5c540d2a03d9cc14995e6670f73413ea229052840a92c0ca7d29f7197a627
+TAG: 8c1fee7d5764e380d56ae4ce4e89ea15
+
+# DIGEST: d7f8107970fc0282d9834b028b571f14
+KEY: 848b54297c8a356de45e80cba043d5b6e55142f57fd34b12045381adc7f0e18a
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea
+AD: ae85706dae237b0d8048088755860de810ef
+CT: 33d3bfa231c8cbf2eb22704d2e74c238910990682537ac4fceb12ff9270f4b3cea36397fe5fb720e9c30e2db1d4a8ff5ba334e5ecde029c8294a30643ed9e079f6f9929f8c86143864c02e3928999af561da764269c88bd55b43
+TAG: bce8080ea0e38e9a9fc24778e39a0e5c
+
+# DIGEST: 39df3d07582daa14814333ee16582e30
+KEY: e24976a963e2ac93d1d94264f48ce84ae4591a76cdeb9330e6de13cf5ff1efb8
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2
+AD: 698cfd676f9ba75f1e3bd26dad5d83e177cd0f
+CT: 020d690f52d8620cdc951a34a0b2a205493d8a62159979a2e3e763ad63682ddeb68777d0df9e565d973a55a63597c41bbd864af6ee095ff73dd79ac20b5bc4d3131ee0e23a2f04a2cad7353d5922f036158df34034fee0f0a4203c4b1486cf
+TAG: df711038864b80d2088ee715fe5fff2f
+
+# DIGEST: 0f30262e08b9551b930db550fa64129e
+KEY: 405074eb0fef7248e2ea50b9af4cabeaa5d36d98fb0b3fe829e07f0b0736b388
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a35
+AD: 7c385c57a3dd898123c3a2e462be0a27625cc4ae
+CT: d5ba95f0b8e2f9ff6e664f739d1b6581bed3cf5a5e1c85989a6f8d9ebf498099e93fa218a7d1cf49d7720097dc995369b4af9428dcd85f9fc06dafe7d3523c31efaedb008731050c36177d12aade8158d4520da420971315bcb1d94f591edbd06e18c847
+TAG: a6622a681089c454474de83ae70d9814
+
+# DIGEST: b751092d3f045def2da40e8fad767908
+KEY: 5d5682f09dfccdd388ce247c386d699dfa7faaed664388a8ab18e6631bd4550a
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a96
+AD: 90a795934b6df5a8c6865241b2209a10f62d27d344
+CT: a232a31ef559d18829d013e9761644df828bab32b47d35f88882663635a04cb0eb92c6419410758c61a0130faafd315c906a103265986154cb1feddb0fc190ec259788df9d9a2dd5bfa8b032fcab9e05d273b4d4e8ebe4f7a5e0ae411b64ecd8f09993e271b7d00c28
+TAG: 8c3c4ec3719158f7838eb58c4b2e2378
+
+# DIGEST: 6a6122b480f31e9e70d8faa299c8d16f
+KEY: af63f2065d0f904656db188f42ca9b2b81d82fa5d6a6f1403a34ec7b0b5de529
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a967227567039
+AD: 101e0aa9ce1b065d4885b21b11a680744adf9bd16da6
+CT: 6e109f5b47b0d893226d967a06ebb76c7755301ce89abc63dc8c5f118b71812317d860e65890f2fabe5c413f9aba7e87f11c2ad8cba62fc9486518712eaf7e55bf415a167b78e895e9fdd58e1283733e59186ab6198a8cd054bc7e8fa86fb80fd62b062242b3e29c4eadc9e0ba41
+TAG: b07afbebdbef82d48dfbcc56f17f9957
+
+# DIGEST: 73eccdd9f1cb7ef7af1cb6c0ae3df636
+KEY: 7ac2ded66388dc0c1f2800aec9c9a67cbf67fca4b188e6e53326d5e63194d379
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641b
+AD: e1a0a3851746eaf41e45025875ad31fc725f7342d62315
+CT: 28c41325ec799cd227b3cca4650c56657fb55fb133c00633aa4308abc34edce12efcd342d9c534fb34fdb03825c18d1c99ba313539008d5ecd6d672d36594f1279f49576930586a1ea0fc510b4c8911440245632875ce785a489eeb47d3013d13fddabfda9cd8ae28de480f13a9e48708bdcda
+TAG: 5cf0055a0b2acd2a57f2e9f6038d81c0
+
+# DIGEST: 9f07f60db37ef4dceb6cbf0b8e535649
+KEY: 507649ef697c8d993846f908f5aaef1bf84fb5a341452f4681df1ab471dc6c9c
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d52
+AD: 405f49e0b808b6fa299686b65665ab3a095fa5544927a7d1
+CT: 09794d3452708818514cf162435c65b10fa64c14b70ce4bdc2db4bc956f016618e0e9b455ce7fbba9aef130d647276b91ad7cb3ed336af75009d3784b3c59ec0a2349204e7ce8941160a737136006eae1e099655fc7321d2f1d89d7488596d97873051eca5b80f8b26a2868431d6d163c5d2651d6317fc33
+TAG: b645e61645a07e61fac07b97ab7d602e
+
+# DIGEST: 75e569715815aa2bde690acb859f729e
+KEY: 45deec41511bd3d828e0643e451faa835fed9e470fef963779c1b74830e0fe02
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0
+AD: 0692280a86fd26931c76e0718285a14054109ef03c942d8343
+CT: a1644288ce1c19ada6b0769797860eaae98c2d9790dac262e6c062ca4c5874163738f7c76af652477efc64f32a6de347e99c1c276fbebbb39420a78140254b18213a2c2ff4d40f84b025f43b93b167d009a4c2fc45f1f918abe78615d1390075f85c44bbcdb9ef5005da4e2e33acf805d67e008dc9411a8831093fd461
+TAG: 67d1b7db04353487e3f4214e608b8008
+
+# DIGEST: 9e465c9c75dd1ffb6f96d356de9e62f4
+KEY: 9b7108139364bb3897c2d9f2efa4a8542eb36df1c5267f3732aa3edf2410c830
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a
+AD: bd6534059f80e7274563d4e5eb44f24227a515fff23a9aaa8bfc
+CT: e99ee67feb5ede62cdf366db78f7f337f454f00afebae547a0789c26393e8f7685328ae452d777fdc904d781c03a2f28f6118a01c9524c607e05213686bacd14333c7c264e7a0da15c817d67a98d35e46dcf68fdc4437a5e19862bc420be79542c3a23dd2ce5ce2d48375863eadf11d75cebc07efbc8c69bd1531a95dbed97caf1b9
+TAG: 8e752b58dac300620d7bc61cd6a3ac68
+
+# DIGEST: 991bcbe41fc4b60b7074658a46c2af3c
+KEY: e09b115e0568384f33986c12705b519162cd1198b8760e0587765e80ab3dd739
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714a
+AD: b3ab126f9d74ccdb4307ad6b041ba167a6ef485c466290643ac323
+CT: 34d473992a113efc60fef9fdc694a31c4859d766c0b72ec8c09770a99e409ada8fa10758bb7e21f1b4f9f75d58871b2217efc5ac662cb28b68b0a2904659c7bc23dae98d526b9f605c4abdf0219b1714f1e78c1d2fa4432c6769596ae53be9358de38af14bb4dbb6d106f36f004403dfdb7c6bb1008a9dbcca2bd9599eb21aac4feccbb83c7db9
+TAG: 34984cb1b7586c0bc7ef1c671bebae2f
+
+# DIGEST: 5cb99ff876a2e66b404d15716b7d33cf
+KEY: 241e2ad471bc3593ba40b444ed9ba1bfaf3e25e4fa97fd3eba808096787c9f9f
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b
+AD: d5ed1803e0a7f8e70073283707197d9f827eb360d7c162e142ecb56a
+CT: 680def6bc859846d22049edbe26e62a82e5dd86bec8bd3b404102231fca22d01957887eca8cdf2fe78ece49bbb7ed81b2865e5f0aa24728de6460fa8875d491b3e0a2cad79be9d5192b044c33570e4372d2a75c730998fa69c2cd2295978f6e448452b647249d0d50b25634768d29facfe83dd516a75a26305f67e11fa9f486a37b2e5cbab9a270568f2fb35
+TAG: 9768ecac8d0c6e0f562c2fe199fcdb04
+
+# DIGEST: 2af6aebae57969457dc4b35666f1a714
+KEY: 9f4f182f8ad7b5f83a8d3ff50898f98967e2ac3d11a14c48658e9d87e7cb3861
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f
+AD: a97131ed7c53c3fb702d2a9fcb0564073ff3ce251322149b25147aee43
+CT: 70c8fd0f091e7bf69bc15becb9dc1a2038d9e2c16dcc50a7f8e34fd24451bc58d1bbbe9734b521e1fc1bfd6c423eae11b3d4e14dbca647751d8b8eff74d3de899b5691e697e64ae2e891081d929916a2e0df2f2820ac8fddc3e6d6922db8bea06fff57684890a602346b2cecc18e633686ffce1d612bb8c322321d3d17c724f14fa03612dc9f96adbb3ef82a50268de276
+TAG: ab806da7a68d8a48df26d5c40afc9466
+
+# DIGEST: f92d7211c575c623597e95fc2c141d68
+KEY: 0b616c9251b85a3e76b4036ebfc9a60be595c0d5cfa7181654d76bfb1d1876f8
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16
+AD: e5dd85afb05f6bf988b762e30e50ff758a27e0b2a2af74bfe1ca3170cd74
+CT: 8b00b03d9b7d7f4d47b14155729bcd01e5bfbdb254396324fc4fe1febe301e7fe94c9a0acab6aad0de02a31b80091309f6108f0723c070b5257d89ac1c04032ad337953e7bde5cccf882b7f982c6549fd94af61ebce8e11d747745dd426d3b1f36ca9744cdd8abc8153a07e894631c00d7fec94ea8a6731dd3a078706ec908c7c36913734270871342d21d6f3585455f92d9cfdd5cfc
+TAG: cb60e6e11e919d5b5ae1983e06219951
+
+# DIGEST: c467729b323d0bfa140cb09c476bce58
+KEY: b1f5de0ac3338a6e2a8859de6f7a2943ff37ec3a561e5a273f9bfe1042d3b113
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e
+AD: fd7dde392d15a6a6e62b44b76d7e3f35e5c180a0188303a78d318b9495442f
+CT: e8514a93be15ec5533b81ef7bacedc857139a6bfcb83cbb7a119af05201e48344a9c574a8b627be09cf9f9eb745876d7ead11135791256fc100dc379ae5e195ea501d35d0e20edae76c2897985e8dfeaa3c5f890b44d61c98ed947e354bc4d1fc77a4e867d33de53bb16ab6b63c4fca3e079247a7f8454867cbd7a07f0c4fe04c2645ba16a3059b1097e9e748653abe65c2ee49dcb3711857e7157
+TAG: 8c999cc7a08fc880529c34560050235e
+
+# DIGEST: fe402ec16468abaf7f877fbc905a2234
+KEY: 9540909f973a2aac86f1eb6a690f17b5e8fba71bfde917e1c6cd10585dbf1dda
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff
+AD: 1f619bc445b824b4c7b752527b586f370b33397b368a97967177e76e07cb631f
+CT: 3a45d2de95cb49aeed98ac07632cd0d11b057e856225224412874ed6b76050d21dee8f0201fbb6f73a760c1511f5a2b6a64b042749e196f0b7526b3e1c6b4e253f451fc9914c8c19dfd0bc40c5ddf17f0c8f5beac673c9cd8d801072e07da319097056bd4ed9ac65cd59de32cff1b0677b521392ee8d3771dbd2d402d55b389a3b6da99385d96a9624f3017ebeebcccf824fe313d803f3efb1abb197fc688896
+TAG: 0e4fb786f6f063fac630b865c3c28ab1
+
+# DIGEST: 18ac31734b9c8854da761a3372d52fb6
+KEY: 336e35e298dc65cee131806aeb7fae339bf033104ba7516f83227aac642c8410
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5b
+AD: 75d1105f6b031c0ae548313a0ee77963b1593564641126c31f378cc0087627e0e9
+CT: f521b529fccd8746d48668f2f3e9112ba54ba1aef9367399e74d5e4a72c34b92bf78ef569113b17469d5b12b285ce3f3742e4c0d2bac07bee6a8400691366a1ce3bcb1e48431578475675a73d3a9981b692847768b874f1d367132af9a6683b076dd4fe1b2c951d8054fc0eb1b9e2f2e2a9d32d5583f91272c8f3595b5749ce0787575168363c68cc8e4bde99ed7623d5f10b3cb013f05f83bd463175cc113f318d020f48c
+TAG: 63cb6a62b5685c4eb3d941184902ea97
+
+# DIGEST: 6cc8384fa07d27f110d4a5f089bc8453
+KEY: 28cfd0a9cf114e6d06d30673ee934feb1b7f20a393e3cca1ae5fb53d341cd06f
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18
+AD: 853d7fa416b8d5477b208fb7aa0c1eead31a91c531c9b2d8b2374609d1778c822115
+CT: f2473190a6443bcacd806c9cac409efac0c07fcb9f3ceaa938deda2cfb968cbe21cb64e7914bf505746e58b1eddcb92a395f3385fc044802442813b8a42f2d8ac5c7053cdd000ccdca6a736fa562055bb17727efb37795eaae295a6ec5ad801e4311bbacc9222beb391da69bd8eb99222d7babbf6c4bb12623088fe8e4034bfa4093bac9620c585c5ebfb4e8cf7f3df818f81eaa26cbd8e8de6ad10e7ec9aa8e7f480a707783165e8c76
+TAG: 1040fbfa7c8b5f9e66f7e8249d1b5a98
+
+# DIGEST: 8db89b23580de687b36d1bbbab3571b9
+KEY: fa8dddde9355487fe71bef43650d9001ceac36c016d396805bc0d8fc1e5f74a1
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8
+AD: c4550983d21a6f2e3793feba06ce2686e59c7434dc71fbe2f7c5e23dac80dc78a22884
+CT: 2704c3898e58fd85a1642d963e3e76e22b60ec944cd602452c50eaad0e4241b079aceac6c353de8bd46a8088d8a7a0df44f208d4d7f37047098bb8e4bb5cac00f177270fd83204b2a78fe2b6aa34bb44b3dbc085fe29e4d0ec911a0895101919037cb4ee55c58c111a116ce6d87bda44e0a36786ebfef49f3acebd1089ed688483f308af7f46c013e94ba9e69fee786db69fb2f3d15e6dc5a54716ffba743dd7e7744ababaf36e4dd499e01d530c7f
+TAG: ff92295472f0bbdf4905f25212adfce2
+
+# DIGEST: 7be6bc7098de1405f8711aae77e1be86
+KEY: 053ff958d11ba6c7b622c8908ecdd383d075fa541a6b921d0557d54b21b7ee68
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2
+AD: 340fdd3c3e7b204327c3f194d945228c4e75ffa01d19078e7c5912edc0040ca24b18b980
+CT: 47c7c42b4f4623dec07de63b2fb89ba1f99d89d4e3f8736ef31fb95de1f92c983cb1ecac4290cc6a2269422c1f1c178048d1ee97fbed9bea9f413850429a49791fcdb601d770a4a8e419aed11386c7dbe323226663aad189fd719d55a4536d469356940433ce0ad040ddb67877b32c7d0c023a30119bc9616f9a2cb56b2c54fbd075fc78753ed2530be3498709c8b23fc331dfbc53d4d3c95d74826bfabd0ed6a643f3dd367e5a0fb51e456d94abea4343c93768
+TAG: d1ff63e67ac07447fa8f078779b7a370
+
+# DIGEST: 4b72ad33575adb3c27fb0d8af4ccedac
+KEY: 1f9445f525533ecf81725bbc15ef6efda95abacd0d520647091c8b00774a59eb
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc05655
+AD: fb21eeec01d5f93c734c809cc2f3963d3eb4a23e1d320b2b067acfa94736ae285adf9297ce
+CT: 53ae1dd644d2af56113c77d2cc6a962d0cde1ca99f90ed14040352a6b78d93badf3ec71343c96bb2c6ebc02907038dee97061d45769f637182586c749ef065bbcf97630d3b84f4d1f5878d717129773341cf7e1094365563f5917ee20712eff9f1f9ee388724542c2107fd1064d775d52083ae95eec07700a258824106a9e47e6b286dc2feb290e855028d6fe76946292a1681d21f7a0569b87e3a4b8729ceccc68661b81d00e87a9764b037d1270f3915f11733b4914af774
+TAG: 1b2284b0503b1fec7f39ad0001953d59
+
+# DIGEST: a5c33f3e07eaac240b05d45bc30f337a
+KEY: 59730bf67e5a12e3b9938b587c7c3d8725bf4c0ca7a9411c5aac3d05c83e0100
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a
+AD: a2ab59e68b2acc26d615b0c67c49e1b6892b299fcd99590c28759d3bdf817e2da8769f884232
+CT: da524a172602e8da90cc38db2b032df4dabe39b7c252cb1915b2d4c7555654895caee09fe670b9f5fde4f498923a5d089270407f2459951e366e5f681b1c4b57793db36677d40213af5240dc18925076af12364194205179bc2236710bbec5bffab310d038f3c338d5de01b729d4360cec5da1b639e24f7f5de9333be802c0758eab62a1893755be637dc06a338b94ec6f8ec8181ddc855018f60fddc9bd4f7a0f6b5993b1394cfd8cf78a7ea2aabee802c2512f9f13de7841a1ca4771f3
+TAG: b537a66bf54a55a4528ac67d1016e471
+
+# DIGEST: 21da54460400518002f59ad562a9d6f9
+KEY: 71309fb840f43f0f85224c7c5a4eecb69353fea11098152ed38519e9431b20b1
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2
+AD: c30cc4db33dbce914aacb3e24a959ad52223ca43a9d9cb57be39b61c153d0c440733f0749418a4
+CT: 6c817982d154fd3cedfb9760b121104578e51750dd759c89cbd960971c9a98f59ac7c23e74836b72da2f3366289db74a96d5982b727612b65f76a20f829db16fadec86e85323af78b482f68591663baf7c716540bf8f036b563eaabf0c46d7b923b756f14a0873c9c0f84bd199b0fbc1f4a33ca3813b5e8dfaf40548ff83d828dd29ff0dc70908e8f75aed074b313ec295f56d162cff60f756b46dd82b3a71af397113bebfe9f7389f2bab10cc83c5336a2700a8517d5e738539fb9f19f2555141b2c3
+TAG: 10ca32b0e2520cd2bd1aa9b3a2c62dd3
+
+# DIGEST: af532bc03384c827ceddd4f75734f0d1
+KEY: 6e101f9b9ef2197aaec85f05e686336769a8d1f14b1ed235dc2b9874e454efbc
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f8487
+AD: 059dbebbf33a35d3f0dfc3264bea5de14e3ee82c6b2bc534ceaacda79f7cda058162a15d44301466
+CT: 818a1e05f3c8bb82179daf8ef0ef531802dbfa475a30bb2e7ddf3a2fc1f60a760446be3b607725cd28ca8a051d012480a41d3e3083458710310ea14493574a6ae7f35b2e57ea317d09dcf97a027663629e9fd8106eb5ef191d352bc6b30e347fbf01d76edd8ec7a77774b69f179d4b2892e1dd4899b494c10fe271ac3efb42ec5be3d47f963fac2263818730ce7b0074795731bdf52831f260d439beaf97ef30745578938053451adefda1d4ed516e7c0ba502ec04a58b064335e8938727e77c53702e4e2114578c
+TAG: 1719ec8f72c97ad1c468c0a2ad096618
+
+# DIGEST: 2b5b9c5c2cb9e1ed454ecc4f959f0699
+KEY: 05bfa62f528e261131880ded8f75e55fdd0173437291a3a136269d26c8083caf
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b1249425
+AD: 6208cedfef0bb99d81420090786910e4176a3af582ad9ea5329dd6a7fb0915d38c45fdd57acb41ca82
+CT: ed72cf943b63b08fc42ac5e39dbc75c98e81564045783a86d20ff3a57ba0c87a0683d55e75cb10bdca03fc7151da62225f4b85dcd7c3678bd7dfdf94d375f0927b160847b3065feee4c5e7d70d1b40e210ef3be92dec3fecb8ba889dbc28b2f68b5674c2ed88b5e96e30322266238cd406f124fad830c5acdbc52de4534d9dbf955333ae5f9063b72a1fbd19c92a64e1f7f7a31fede2346540083a7688a6095829faa8e3039466dd56e3a3e851acf8ad23c405b91233c47af417b7d807fecb83270d18e4b6c6c14c6f767abebc
+TAG: 8c526eee81898c9ce3b91543241772d6
+
+# DIGEST: f09d842214003082d5191b5189305d08
+KEY: 247b06fa98f27524f20822f77cb7ccea4ea7c157c48c69c6fb9fd1587d78fcbb
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3ee
+AD: 3042c6e7d72a29e6edce84eba2a7f1e3181f036b5d6297b3d5e37bc9d95583fc41f9a9ce77e80e6045ff
+CT: 8ea32e98cdf9ef00199145a329495dd0bfd4b0b82e4933736f20b234b6f55e5f45234cf4b86980fa2ce29410d505872b9ecbeb150f1a1cb6a2bfdf34133da744a47af4be3681f8a9bfaf3cc067d07cc9b08e1990acedcc09b2072341772df05a6ce89b22798bfe2010d0ad4ed3e7e717a6a618270b942e2821b8a56a64d7ef8d16d8fb5a69bdae42f74edb55e7b93b7ad461f7c1c768e98a8d2c58db4b6b7b4456282ce4c845c2a68e1446902c9038a2c2f7368df609905ca9fc3d89336139267fb015dd5fd35a6855dab3bf7402f55b2246
+TAG: dece7385ea9fb345dd292a17df669601
+
+# DIGEST: 318dd9752e504ad86d7ca1dd0c0cae2d
+KEY: 46bcc353d7662420aa2c6bb45e5c3b2a236408ceb8e29fb7690254450e6cc94d
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c
+AD: b5902fd1a471078c3c1100a3a4cdc1cff0fcbfc02d2a629f7ca9f8cdf86726df667dfe9469d95cc0b127fc
+CT: 4a38c5b4be897e978922bfb618e6726a43896e6982bb16cc06787c436e60be59ca6fe1973a3c9c78f43ae1674ecda9e7e84b8b8c3dfe1b1bef9ac16eaf2dae550bfd90704b22d35818f2b6d506bcc4143df2954f1854ca27b2f8f51636d1674bf8fdb973b2079e96c35b003db58d453383cc699fc4c6db457fdb947b981e2aa9a0160712c1794e6cb44666b100cbe938ab21c778b31f7637d68c54f97d74464a5f1cc30b54b49ea4f25aa0743f09f62b0d47565ea4b8ac15db9e74606137f4b9612d7dcd8451ca44e3afd68b718875384ebf9934dceacb
+TAG: c4960de7de637dafd9091ef5ce3859c6
+
+# DIGEST: 25cbada808a6a93e7985e078511a51d9
+KEY: 75dd14aafaab797cbe668f03601aa55e918702521dfbba55226a694a4bdbab89
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0
+AD: aeebc9cd8f747367d7b4e9663321fb37a0c5ca8e338b39706a52f8d14e884c3f940d8f00e2930c60fb7c149b
+CT: 81ebb56d4cf9dee6a6d33a2273e2f6a06b320216fc7826efd9dee6837e6109836ca959a09faefb0fac2031ccf4f8314574d74eac961462e00ef0cfd6fb0e8c04aa4d8bba3cc88ea7e29a82656a3fc8081664b2c47a437402a4eb441db1bc34c077f433c387ac66986756f5d27934b0ca47fb309d5385a96781133829ce0e9dd10a49fc07a3fbc0faea668ae1f254e6e00090d08fbdf0f70d8a7fc6aae65cd7a30ccd9fa0e0e984ace5d8c5ddbac2f7e37ee02f6f74d9cd2a8a2de92be9b9388c572975c5892e8792cd36b8c1d3cf0ae6adb17168c4b70aff7700bd52
+TAG: 088d7eab71f284c622c875c17d8f743b
+
+# DIGEST: 014bcfcce7883834a083b8ba06c1649d
+KEY: bd68c111fa785c3bf90d4ae8e87d979e83ba6300079b549559523f42881aee24
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad
+AD: 7f2c3c82295dae1cdabaee8fe5b43b8363e8e7c8fa7b9d482009a545d43608f4e799377ab11c57fae801f1e22f
+CT: b79a718d3e1efaba90c495efe12a8f005e9d7c8763292b4c45170e6102cf77262d22bc90dc0e086284c38fb9f67e68b813d0e0ac4d31d1ecead8b0ed54ea690aa65c6eb4492eb0bc8453e9444e49fa07b6e96d360db11110cd419348ab799cb2432ac14ec46ba428352db53d835259b20261bb082152ef5c2f7a0e03b330e006c6a38e70126a806aec87390f66254655a12ea51097cd00a8cce011e573d951f75ca5342c45a29def2dbb957a6960f5c4b9bf30530f4f2a2b0c1b85a0203d7d9eb90169289f3496ed97ae37d2eef4d726ff2b97dd94b157cdb60bc22c687a54c283
+TAG: 7fd828c5888eaaa037c04db17dcd9622
+
+# DIGEST: 1b249ba6570a60750f56216a03087db9
+KEY: 5162491605b3598b50bbe237b5c03136b0df8ffecba88c95256b6ae5e1490fd4
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c
+AD: 689b850d9a80082d1b7a9bf49c2ab77f14ddf5ce3cbe930419483545a2e0ddf620c3b2cfdabbd3f90002e8dd489d
+CT: 87f7669a2097f8258d329fdaa1c5f67d95589ef3bed4ee74a6b3ade45b0b7ded8449a4a1178f7c3233f42178b80e1396174d6a38f55dd4a6b35986d674a33f6cc36e26ad5af114e0c3e3498171a355fe66d898ca92a1ac27bcaf8bcc04d7512c09c4c22c3f189d3b0ab04b743eaab2050373f150eb14ce64fbaf94ee5dfa6c834103cb6a182d021d9c35896c71aa9cda9f25e6159197675e7f9d4d68ef0dcd8a472063069dc8e5c0b6697643ffccbdd7ca16cebaacb8477d22fa6c14fbcf8ec86740d8e16f4fc62db197ea170bb511d1e42a4f980dbe10a8d6659df7689971d778a8697ca30a
+TAG: 84de464c30439d1610abfef444431bb4
+
+# DIGEST: d4cb469300aaa744a7389eebd963d69c
+KEY: 53ba2ddb469018a77f9a1833dc33396393252a194e62e8f021c6f9d4a9337a73
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f
+AD: e5171a1f0f858650a550d1de6094dec1914ca8e33b07cf454e3f5d4ef8e9d9d4153c082a1d736ea62f1638b86f6c5e
+CT: b098d2dcb2cc0c568d47eaa8c2d670870cf97bca2179d5fd1fe08832b7f4c881a31eeadf46e2c149018b60de53c6000f5f2ef4d55ccf825ab71d9a6484e96658a8da7f0600179c6a9259efa759485660d9606be4adfc3ca632d95c1e4b29f98b2dde7e21090a2c4cb10f3364919d3d8e34fae535d003270ba8a7775384bc7c2da7791131cfa477f94fdaa80572dc353ba84ebca0892c76aeb8c287f1d32e74b6edbfe74d7e494a47ae52c6fbde2fc0d601bb580f0cda90ff90806ad1376ea9e13e9ba583dd2c9b25d490539d3fffadb4e806ee1e8468f98c2b2a11064d0a4b46d1a63bece469e2c47de766
+TAG: 7a8eb32edf43c0c4516c9d82ca554162
+
+# DIGEST: eee29ad10047ca157e07b672e86b2c94
+KEY: cb337ce4a872340f3bdff5b4a6d2bb231b42470c3c58aa599f44d94e6fa6e785
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808d
+AD: 6171478fe4db9045333de9ec2517b28a558e21dbd0570c016410b1a9f8354d3b4b32fbe8f83257b0c1084aae47cd5581
+CT: ae06668088998239688ba654f135ced34afc17fe4e041000eaee458dbc24b0d28f06dd11830f9bb9ab609687be2638c1e5d61962374d21544e0888eae834492f4650225d32fd213bcbdd84bf3de224d71e2a7e2cd02759ce2f1ca7425485d65bc6a8055da7b206214c05a1a65fda8f442996ca74c1753b0b89fca25d96e8267526b9ca25b9d2aeff22b1f3ee66b21a73bc1b35a1d87c791c365ee1468622e31784b39a07c14cd744c44028e548e257a348cc10c911c8daf6620dad9d1a30670a8350bd665807edf9f8eb5534592c7b2ba3470ff9e0f68e88b5285fd2e1691ad2c88518161c95bfefc1f362cfbdb3d76a
+TAG: 33bf2c10a12bf3048b87347a3d498d67
+
+# DIGEST: 686fa9b34109ff25c025959c90d88bfc
+KEY: e9c23503c127ffe0925e6f7a19de8764a9daadc0ad7cd07cf096d694114309b2
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f38
+AD: 3173b312611cf454eefb012d40c1dfe70280c522781fd7a86f549f85443cf711c551e2e2db7d1bfd8f4b0f39efb1ed7bb6
+CT: 77e0472e3f5a86f77e5f9ca54afd2b4185d4186dc0dcab95e5215ced58830244375c3f77a11b894d6e57536a28e14814c75651bb5b913323acb676c988df8947812bea390cccf8395ea72848dc789018ef7995b5497dc1e79d3974b4a7fabb29ed3597be12646d5d7f72ca8209964bcb47d9d3e4df3ea64c16221cf70b899f7f03c321f0a1aae64d52bfaad08488e9d5073bdfab8db294ad975d9681d28b1525f0317045e37147791da839008a65c26652d46874dc82cf92774122c6e96dd7945eb8108e29161c49ccdbf2ca7e331c1561e243aec1d85e1b43d335dc77ba2e9033d620285004eda15b31b005401d2da675a91079f0
+TAG: 5920706d1263a8a461891c368ae76cba
+
+# DIGEST: 4b7953449fde554715b457d8c39befe5
+KEY: f03456a35196feeab6fecef176b2c438669da23a7c60658c5bf87ec83be579a8
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c
+AD: 86d995d1c7d7afad82c250882bb625dc7dce3b8a5b977cdafe12e1f8b071735ba74e599f21864051290502f0dcf103805a77
+CT: ffe8bfd2a7d5d59e0f2effbb47c383fcd799f78264fc80d1f82a66facdd2ca5a9bad595bef504f5d86f6742f108182586710f76cecb753742401b058d0ff0244b3ca84391377ba9cde9d06b1c19c69d01ee2567e622cb5f814af65e8285adc6f91db207b946cca66eb76fd64522d0640daed5dc4048a404ada573f75a242cd1e50da7e74a4538b807e9910c4aef839c8a6b3859c1e0e1b9176d4c6b2630034a7ea2aab000cb177e77de1cd01dcfd8afec8a92b15715c79c80778a8a70994edadf98af059dda8145ed859c87e7d7dfcb85058454443305a9d9b30f247f736c88209b42f926a967bcd66f9767c77802e26645fda4358ecb7245e26
+TAG: 5854d5619ae8716afd509d830ba9f7db
+
+# DIGEST: a630d5d68891aebd47b490f08e19a739
+KEY: de2a9922525db29ca07b00051d9600ce153de25d95cdc522ecfd5283dfbaf511
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbd
+AD: 2ba6bd7742e7d17943d143cf3374227ca78cb3293a6a1e7e8076e17d268d0cd2fd783f6bbc0f4c36ecfc0ac05226b2357403da
+CT: 57af81ae86178ec7bcc40bb9199e76907480c366da1383dc8ab333f3fb5e1c175f4605112efb6254e52acccc5fabbd62fa7cdfd375aa332cb56833ff0b66cb316c51b3e203326ec185c418fc03153f10f7725c9729975be8a1e68b39e8a333fd673f89dc44a8b45b8be4297497ec019be72341d3ddfe612902e371b92a4e648c8cc3d91f61e0a0952ce3591301036c3c4a3411bffdf07663d690117b35150507eb0e9435b901136d0a751f0ce4495358e13ccfab7e84144c52da8f4f2cb5f4d923883b4110c35a1121fc6e6faf4d9d658365d23173253c172917eddd41968dd3d8f4a5c6dde2731b8e656737855ee66b2695e8a05bf4ce0f03e645e5b2ab9c
+TAG: 77b3b9938201e4765c3194174fbaf94e
+
+# DIGEST: 4b48b4da39055d54e7c36e052db92b67
+KEY: c197c11f7b7e4122161dc0dfc1aadafaa8448c0ffc45e2bd5d9c215254e5be4f
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc
+AD: bae8d35db7b085513cc8f77d28df4a91999a60a80941b04f88073d83ae80314d128cee8c88f556f14e5a15671988944c70cc4936
+CT: 448287a7ff61072d66fc3d7b4c55d886e28488ba7657cac77fc4879429efdba59bd21cf4ffc589dab8a162a37cd348296d5e77716c16ec7895a53a5f0934904f087e6bcbdeb14feb753ee420ca6da2d5b71b744d2cdb53d4af110e43214c0e9df00963ea58ae88d34b1b249ed5c742e1912ea887ffbe191e8097f9e14579b6cc21c744b9ab8780f554e948e4f36e26c19af6b3a999b3ec96eea43a17def214bd5c9a17529f355d0b82f711fc33cd784b86e4f3c7b5180948c0ac630cbbdea277b461541ad66cc2e6f46b219043f88a2f3a12ca964996b31936938564a13dd64fc5cc3896a8ede80c99816424122657dda717c6f38b0b9af6f95186b0ac059c5f0797711d
+TAG: cfd40021e479659e1fc7abde109b49af
+
+# DIGEST: a150046cf91f68956fa731206cfedfe8
+KEY: 08e292a9a42718361cfe1b902094421947612ed2e328f1681a4908add04500fb
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314
+AD: 0f6bc1ba0185f3b49848e0a9e911d03e75e2b842219f6b7019081a46809120038c4f0255f85f118e02a2e03f6288342767c130db44
+CT: fab561933a0232f2b64cb29868937fa425b7fc0276d3049b1e1ee34516c5449f5a33496425b20a6f0357a511fc1986a671880977ca49008991fda162767ff5bfef87c59397463ce5a0f874fd2deb593ef67a795b1495e232b70a18c628307943b0170066f7fdef251dca811736fe57d0cad52e8818bbc96261480040b314bbaee09e077c164b663577beae3af8bdcf9cf9d6dcb979d2dac0c3363c472d1897fb64cedbf1a567524f376a865be245b71cfca16f6eb51dfa5705c003ba60e38528dddb812591e318877884bd5d7828aab99155d51fc348a1f5c681780f1d3d9de78874d94b923f3c6bbc12cb6b7d12bed8dcc4ed8087ede92534ef961a09e1a239e73c7cca3e2ea5cb89
+TAG: 50f411409c32233baf2a60a9b0dc9a61
+
+# DIGEST: f763aecc431deccebd0d4563fefdb3a1
+KEY: 1b1488c64f2b00f1ef0fec3afd41627b6c6d75b6c1b29331f3ddab94b35c1c86
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4
+AD: 2469f118fdac93c3dd165b1a16a3ae3f30bd66646c535a543a0f13d845fa3ce47ec82620d7549c1dcdc2d5523ffbb00f09bbc16c24c5
+CT: 3552afc02fbc78ec0bc1ab7ecd2de95a793def7e212fa4c4702906d5477d8f1d535b7afae5729a774df48014a85a70741d6ef78e5ff48014b710d6a2b1ffffa80f64b820c14f902e50bf88ad31425e91648c66b18e0af13a2d4520c317aab735762a2599bb7d2b31dbf148a60f167513576eaa27ea6ba5bf45a6c228b704e174e4616aa8d4eaa65c372404c595091f36bf575a647c4878d2c3732da77df37a29ff925efa5232b24cd241ad43060292e5862d60a1623d96819e8f914e51c1f9fb0a6e664595be0479fc9df4ae8132b08faedc01313a4dc76f9d6005418e933b6036ada5d787859be0541b2b015d48d4149a46cfdda71f7ec2c52024720bf0ca16d424ebad973b8cc5d88b08575dd0
+TAG: f0a16e0a7731c520ec2ca403830e126e
+
+# DIGEST: c07e21a15b9340392b0d53d174c3ccd5
+KEY: 40a9a2044f304c1d61088c451d1b76f8789cd888ebcfedc1318d357f386c8e1e
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4a0a6268403
+AD: 3f7051a30c8cde3c5213707e26ae0d63e4339cf6f0a5bbe7e901cbd54f66d141233cb29127311a1151c57a6f671b90ed7ba280dbaaaec6
+CT: aa8bc1464d6ec20d29fffd07bce11603a06256521a39767f23144a7958ce47adbef5b006058dd8b2c8f6098a15794f97b473f522812043be23cc1a2992e35f13802219d23fc46465d1f7d1c2238e52d5cd353c9819698825c043a7ba11ce8151391d54f1ab49270b4f80fec08a3f6e6da6fc01a3cbf3b3e304e339a5e94e74564772e4271f20cac9b9287a6281b376bd45742b435761bb87457be0783dad7f7f17d2e28daf8240cc58b7be75a39a7244cd4eb099f92cd73a8d6bda2b67886fc7549f939bd1876469e2c64c4ef1d738add80f81bd719131ebaf8994a7c31520b7506270d897ab9ea41b9eed4a7290638cd6882ded7bb1408cceab99a1fc3f23b42dd261bb55231ed3ce58e8e93d3e6f08d223c7
+TAG: 875d2a9cc3b4302291a17ccc071601d8
+
+# DIGEST: dd7e271d8e93a193b3a4321c4fe66dc0
+KEY: 2ac1d8d8703fefb65450e27c50f6276fc8e6cb6b2a549d2d4934e1e61b379e10
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4a0a6268403856e827f27
+AD: 2dc9ccd5e8db08c13955ce637811f05a846acb577899aa6637419456df30805e6340a3b180a2e896e72bbadede88ff79e60b8cc260dd67ee
+CT: 2f1d4c18c9d4af937fcfbd309415ff2b174c9b836d001f4fedc232577bb3dce49bf2622e0437dbb85ea6d59c43a6410ee7464c4f0530e52a85c3561eb1e8a8da98a44327fc1db261348bd4cc3a1449de19a846b5ca70332bb652881b83966500c3ded5fc51e92109577ad46ef929c163c0c4fb960208dff758fd4eed6dafe749017b592a9098a51f571b6fccb721704c653077baeddf1ed16b473aeb1ffa704c94336e12f04ae342dd25d6dd6a80197d9290de239b0485f4f7ea8ad5ecdec411297ecf832749aecb6666adefd3c48b641c6b93d688cb034714ba66f3043d8ecd09fb013bbc1a97b855190d9f0a3725cd943c0affc7e0d8ce6e32ad963b1a14220ae7160a353ed1ddd60155915e2c7f02724591886e040f1a
+TAG: dd1a6a89a694f01334573d38b8e6cd79
+
+# DIGEST: 06b6796fd37112be53595a70989ad352
+KEY: f22a8f3d0e11c7b7819ec255bd6db72800f8189f03df23992876084ae93fb844
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4a0a6268403856e827f2774f24dc46b
+AD: 5bec894afdca19440745dd56bba8f534d1ca91643782b8ce81e628375c88fcf0496e758c5d2ce2845158492ca464efd4200c44179936d9b034
+CT: cb0d190c37c4c73322bb7056cdf5e7316e71e219bc21f393f9f636695423976b9153c2aa1b443f236e08f933fee951068041df187adbdc6c8d152c980019caedb0590626f02a19e50786fbe7ec850acc813974a2d4c245378cda72755161298f1ca6bfbd9648a1aa0ac7792a5166a3f17a4d8ccf0b76e5ced30875bca0e3bdf5cae0ca338ab85116f64dfdb529f8b2c349e442a8a29cfeb28aade7d1c02b4d9173da99e7fb3bee466a291e1b1b368583b5050eac6329eb584b2c30e6cde1e032e969d9fcd7df5d5197de76065ed82422ce852c2e14e5ceb06241ec841f4a826fdb3b69dce128ef5654b45b5e54aadf32f5c57021516e3aa9abcc0b06b19ea6d88a3c42f86b8102482e033a2e4323dd98a698973ed77a662204611737b7
+TAG: 18a5286d150598edeadd64baf43265a9
+
+# DIGEST: 977b28589ed2f699c22cef743529bb4a
+KEY: 32284c503bd8a9d24194ff81700121824c5de1b2321b10b4f444ff46f52a4440
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4a0a6268403856e827f2774f24dc46bdbe89deee6
+AD: 537f6d9792f44c535591329d1d303282e724e6128cf0ad87cc42ed1f3efca8a7a9599453d867a42e32960ae794d667ab7a09567659c72108f489
+CT: 4555c01b50d31e03d628d5cbb829679dc57b59bc440cabf8508fb2b0c2a047ed5cf0c4eac693e9e1c3786b7859cb36526c0f582d3a6ade33fbabdfe2cb8ab35297a334a842d7f7d6001e0d0cb88953748c1108e47f1376da03d5357de609af607240c8b3ab288cf6089d69b9e779caf0c165721e119718d56b8e09839a7c44940d5efd92da7396b2994ff3490c3a7fa79470588fb58f9098ad551707c6a0026aaf3f4ee808a8489586c0a41105e5c45a3480ca2d228ceeea00cc6d45fae6a8c277be631afd41fbd9e8d705df3fe16998d8a261b4d18145afcf038837fe1e382bfa02e51eb95baa3cec19216db43303339a09edad07db0374660dd645d8e5ae5cd5358fa158ce15ceaeb328b48e810865ad950a4a521fd281b1a06e63ea1594fc3ee0
+TAG: 4acd7ddfb275b4b83e019360b17f60d4
+
+# DIGEST: 04ff63330bf604ad98e6f08427dd29d5
+KEY: 43285f0a60b4d3726884b8aaa22603b3fea8de61bd4af85a15ced2ce9fb4c60d
+NONCE:
+IN: 86493545a236270a2e85e5d400587d5110b1a9deb68088656deffd1d79ba653a9f3bb1dccfae69e3767a97a50caa98014cb46f727a96bcef3103d531fe2da397396af3c349c4b10d4d2e75a6e461d774ef3a8b20420fcb2686ea8846bafff2e4b8c37a358979f13a9672275670390c727d641bdaed972d524b00407bf0685c91ff1a69369e714aa3b4dda90b4b497dbb9f4d28162d16af2b323d5e239e1483ff03b6e7be5bb6abdbfd18b6b5fba6b8844d88b1f2452fc056553c9c1d156a8338ba7cd2f1163f848738b12494254e9066f3eea649d4cf2c1aecd4e7a0416ea303ad886061285c40698fab9f2d3033808db1db2b1f380ff4f5966c132a687dbda473acd3bc672d932314092371eff4a0a6268403856e827f2774f24dc46bdbe89deee6f77c6658da
+AD: 56b59f5333370068732c0651190c38efe136b72ee674067aa6e7c101dc8211c3f2819060dff44efadf4a3aca14b2c1144f7cc01b55d3e492f9b579
+CT: 997ebbbcb17a64acdc82f44a27a1cd4f26a761982da2a32860a81dc4df9bd369919ba0ee38bff1fe49a3b764808b2aea708d3777351073a299cb81d930e8c1e42cd57fa15ef834ae078808dfb842551fa15d391d793f2f04edd9ffc9a1620faae011e0d048571948168fc226e2169ba53944b9634cfb20caeb2c5ca3cef1bdecdfc5800b05869557f9562d4820c62cef473ff84cd7f548c6b5938a7320712a3af24db568eff762efe3b4d0bfc3bc63d71028b1bbedba039b9d9f2b894f7bb77751e4e621145ce5487c31c3fa260c3135e46c255179f13607918655ee3b31bedc3e82bcb1f23756f957a2011c9c715f8fae65e102377f12f96c17b03eabd6c5fe5d019b7972b13cdcc91852b8ce6804d1a444fe1ab2664c80f2c176141c752a9dd0e898894fff11
+TAG: 1693c54dbc82e80fb062264d454e40f7
+
diff --git a/crypto/rc4/CMakeLists.txt b/crypto/rc4/CMakeLists.txt
index 0072832..9862af2 100644
--- a/crypto/rc4/CMakeLists.txt
+++ b/crypto/rc4/CMakeLists.txt
@@ -5,6 +5,7 @@
 		RC4_ARCH_SOURCES
 
 		rc4-x86_64.${ASM_EXT}
+		rc4-md5-x86_64.${ASM_EXT}
 	)
 endif()
 
@@ -26,4 +27,5 @@
 )
 
 perlasm(rc4-x86_64.${ASM_EXT} asm/rc4-x86_64.pl)
+perlasm(rc4-md5-x86_64.${ASM_EXT} asm/rc4-md5-x86_64.pl)
 perlasm(rc4-586.${ASM_EXT} asm/rc4-586.pl)
diff --git a/crypto/rc4/asm/rc4-md5-x86_64.pl b/crypto/rc4/asm/rc4-md5-x86_64.pl
new file mode 100644
index 0000000..272fa91
--- /dev/null
+++ b/crypto/rc4/asm/rc4-md5-x86_64.pl
@@ -0,0 +1,632 @@
+#!/usr/bin/env perl
+#
+# ====================================================================
+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
+# project. The module is, however, dual licensed under OpenSSL and
+# CRYPTOGAMS licenses depending on where you obtain it. For further
+# details see http://www.openssl.org/~appro/cryptogams/.
+# ====================================================================
+
+# June 2011
+#
+# This is RC4+MD5 "stitch" implementation. The idea, as spelled in
+# http://download.intel.com/design/intarch/papers/323686.pdf, is that
+# since both algorithms exhibit instruction-level parallelism, ILP,
+# below theoretical maximum, interleaving them would allow to utilize
+# processor resources better and achieve better performance. RC4
+# instruction sequence is virtually identical to rc4-x86_64.pl, which
+# is heavily based on submission by Maxim Perminov, Maxim Locktyukhin
+# and Jim Guilford of Intel. MD5 is fresh implementation aiming to
+# minimize register usage, which was used as "main thread" with RC4
+# weaved into it, one RC4 round per one MD5 round. In addition to the
+# stiched subroutine the script can generate standalone replacement
+# md5_block_asm_data_order and RC4. Below are performance numbers in
+# cycles per processed byte, less is better, for these the standalone
+# subroutines, sum of them, and stitched one:
+#
+#		RC4	MD5	RC4+MD5	stitch	gain
+# Opteron	6.5(*)	5.4	11.9	7.0	+70%(*)
+# Core2		6.5	5.8	12.3	7.7	+60%
+# Westmere	4.3	5.2	9.5	7.0	+36%
+# Sandy Bridge	4.2	5.5	9.7	6.8	+43%
+# Atom		9.3	6.5	15.8	11.1	+42%
+#
+# (*)	rc4-x86_64.pl delivers 5.3 on Opteron, so real improvement
+#	is +53%...
+
+my ($rc4,$md5)=(1,1);	# what to generate?
+my $D="#" if (!$md5);	# if set to "#", MD5 is stitched into RC4(),
+			# but its result is discarded. Idea here is
+			# to be able to use 'openssl speed rc4' for
+			# benchmarking the stitched subroutine... 
+
+my $flavour = shift;
+my $output  = shift;
+if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
+
+my $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; my $dir=$1; my $xlate;
+( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
+( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+die "can't locate x86_64-xlate.pl";
+
+open OUT,"| \"$^X\" $xlate $flavour $output";
+*STDOUT=*OUT;
+
+my ($dat,$in0,$out,$ctx,$inp,$len, $func,$nargs);
+
+if ($rc4 && !$md5) {
+  ($dat,$len,$in0,$out) = ("%rdi","%rsi","%rdx","%rcx");
+  $func="RC4";				$nargs=4;
+} elsif ($md5 && !$rc4) {
+  ($ctx,$inp,$len) = ("%rdi","%rsi","%rdx");
+  $func="md5_block_asm_data_order";	$nargs=3;
+} else {
+  ($dat,$in0,$out,$ctx,$inp,$len) = ("%rdi","%rsi","%rdx","%rcx","%r8","%r9");
+  $func="rc4_md5_enc";			$nargs=6;
+  # void rc4_md5_enc(
+  #		RC4_KEY *key,		#
+  #		const void *in0,	# RC4 input
+  #		void *out,		# RC4 output
+  #		MD5_CTX *ctx,		#
+  #		const void *inp,	# MD5 input
+  #		size_t len);		# number of 64-byte blocks
+}
+
+my @K=(	0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
+	0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
+	0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,
+	0x6b901122,0xfd987193,0xa679438e,0x49b40821,
+
+	0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,
+	0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
+	0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,
+	0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
+
+	0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,
+	0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
+	0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
+	0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
+
+	0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,
+	0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
+	0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,
+	0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391	);
+
+my @V=("%r8d","%r9d","%r10d","%r11d");	# MD5 registers
+my $tmp="%r12d";
+
+my @XX=("%rbp","%rsi");			# RC4 registers
+my @TX=("%rax","%rbx");
+my $YY="%rcx";
+my $TY="%rdx";
+
+my $MOD=32;				# 16, 32 or 64
+
+$code.=<<___;
+.text
+.align 16
+
+.globl	$func
+.type	$func,\@function,$nargs
+$func:
+	cmp	\$0,$len
+	je	.Labort
+	push	%rbx
+	push	%rbp
+	push	%r12
+	push	%r13
+	push	%r14
+	push	%r15
+	sub	\$40,%rsp
+.Lbody:
+___
+if ($rc4) {
+$code.=<<___;
+$D#md5#	mov	$ctx,%r11		# reassign arguments
+	mov	$len,%r12
+	mov	$in0,%r13
+	mov	$out,%r14
+$D#md5#	mov	$inp,%r15
+___
+    $ctx="%r11"	if ($md5);		# reassign arguments
+    $len="%r12";
+    $in0="%r13";
+    $out="%r14";
+    $inp="%r15"	if ($md5);
+    $inp=$in0	if (!$md5);
+$code.=<<___;
+	xor	$XX[0],$XX[0]
+	xor	$YY,$YY
+
+	lea	8($dat),$dat
+	mov	-8($dat),$XX[0]#b
+	mov	-4($dat),$YY#b
+
+	inc	$XX[0]#b
+	sub	$in0,$out
+	movl	($dat,$XX[0],4),$TX[0]#d
+___
+$code.=<<___ if (!$md5);
+	xor	$TX[1],$TX[1]
+	test	\$-128,$len
+	jz	.Loop1
+	sub	$XX[0],$TX[1]
+	and	\$`$MOD-1`,$TX[1]
+	jz	.Loop${MOD}_is_hot
+	sub	$TX[1],$len
+.Loop${MOD}_warmup:
+	add	$TX[0]#b,$YY#b
+	movl	($dat,$YY,4),$TY#d
+	movl	$TX[0]#d,($dat,$YY,4)
+	movl	$TY#d,($dat,$XX[0],4)
+	add	$TY#b,$TX[0]#b
+	inc	$XX[0]#b
+	movl	($dat,$TX[0],4),$TY#d
+	movl	($dat,$XX[0],4),$TX[0]#d
+	xorb	($in0),$TY#b
+	movb	$TY#b,($out,$in0)
+	lea	1($in0),$in0
+	dec	$TX[1]
+	jnz	.Loop${MOD}_warmup
+
+	mov	$YY,$TX[1]
+	xor	$YY,$YY
+	mov	$TX[1]#b,$YY#b
+
+.Loop${MOD}_is_hot:
+	mov	$len,32(%rsp)		# save original $len
+	shr	\$6,$len		# number of 64-byte blocks
+___
+  if ($D && !$md5) {			# stitch in dummy MD5
+    $md5=1;
+    $ctx="%r11";
+    $inp="%r15";
+    $code.=<<___;
+	mov	%rsp,$ctx
+	mov	$in0,$inp
+___
+  }
+}
+$code.=<<___;
+#rc4#	add	$TX[0]#b,$YY#b
+#rc4#	lea	($dat,$XX[0],4),$XX[1]
+	shl	\$6,$len
+	add	$inp,$len		# pointer to the end of input
+	mov	$len,16(%rsp)
+
+#md5#	mov	$ctx,24(%rsp)		# save pointer to MD5_CTX
+#md5#	mov	0*4($ctx),$V[0]		# load current hash value from MD5_CTX
+#md5#	mov	1*4($ctx),$V[1]
+#md5#	mov	2*4($ctx),$V[2]
+#md5#	mov	3*4($ctx),$V[3]
+	jmp	.Loop
+
+.align	16
+.Loop:
+#md5#	mov	$V[0],0*4(%rsp)		# put aside current hash value
+#md5#	mov	$V[1],1*4(%rsp)
+#md5#	mov	$V[2],2*4(%rsp)
+#md5#	mov	$V[3],$tmp		# forward reference
+#md5#	mov	$V[3],3*4(%rsp)
+___
+
+sub R0 {
+  my ($i,$a,$b,$c,$d)=@_;
+  my @rot0=(7,12,17,22);
+  my $j=$i%16;
+  my $k=$i%$MOD;
+  my $xmm="%xmm".($j&1);
+    $code.="	movdqu	($in0),%xmm2\n"		if ($rc4 && $j==15);
+    $code.="	add	\$$MOD,$XX[0]#b\n"	if ($rc4 && $j==15 && $k==$MOD-1);
+    $code.="	pxor	$xmm,$xmm\n"		if ($rc4 && $j<=1);
+    $code.=<<___;
+#rc4#	movl	($dat,$YY,4),$TY#d
+#md5#	xor	$c,$tmp
+#rc4#	movl	$TX[0]#d,($dat,$YY,4)
+#md5#	and	$b,$tmp
+#md5#	add	4*`$j`($inp),$a
+#rc4#	add	$TY#b,$TX[0]#b
+#rc4#	movl	`4*(($k+1)%$MOD)`(`$k==$MOD-1?"$dat,$XX[0],4":"$XX[1]"`),$TX[1]#d
+#md5#	add	\$$K[$i],$a
+#md5#	xor	$d,$tmp
+#rc4#	movz	$TX[0]#b,$TX[0]#d
+#rc4#	movl	$TY#d,4*$k($XX[1])
+#md5#	add	$tmp,$a
+#rc4#	add	$TX[1]#b,$YY#b
+#md5#	rol	\$$rot0[$j%4],$a
+#md5#	mov	`$j==15?"$b":"$c"`,$tmp		# forward reference
+#rc4#	pinsrw	\$`($j>>1)&7`,($dat,$TX[0],4),$xmm\n
+#md5#	add	$b,$a
+___
+    $code.=<<___ if ($rc4 && $j==15 && $k==$MOD-1);
+	mov	$YY,$XX[1]
+	xor	$YY,$YY				# keyword to partial register
+	mov	$XX[1]#b,$YY#b
+	lea	($dat,$XX[0],4),$XX[1]
+___
+    $code.=<<___ if ($rc4 && $j==15);
+	psllq	\$8,%xmm1
+	pxor	%xmm0,%xmm2
+	pxor	%xmm1,%xmm2
+___
+}
+sub R1 {
+  my ($i,$a,$b,$c,$d)=@_;
+  my @rot1=(5,9,14,20);
+  my $j=$i%16;
+  my $k=$i%$MOD;
+  my $xmm="%xmm".($j&1);
+    $code.="	movdqu	16($in0),%xmm3\n"	if ($rc4 && $j==15);
+    $code.="	add	\$$MOD,$XX[0]#b\n"	if ($rc4 && $j==15 && $k==$MOD-1);
+    $code.="	pxor	$xmm,$xmm\n"		if ($rc4 && $j<=1);
+    $code.=<<___;
+#rc4#	movl	($dat,$YY,4),$TY#d
+#md5#	xor	$b,$tmp
+#rc4#	movl	$TX[0]#d,($dat,$YY,4)
+#md5#	and	$d,$tmp
+#md5#	add	4*`((1+5*$j)%16)`($inp),$a
+#rc4#	add	$TY#b,$TX[0]#b
+#rc4#	movl	`4*(($k+1)%$MOD)`(`$k==$MOD-1?"$dat,$XX[0],4":"$XX[1]"`),$TX[1]#d
+#md5#	add	\$$K[$i],$a
+#md5#	xor	$c,$tmp
+#rc4#	movz	$TX[0]#b,$TX[0]#d
+#rc4#	movl	$TY#d,4*$k($XX[1])
+#md5#	add	$tmp,$a
+#rc4#	add	$TX[1]#b,$YY#b
+#md5#	rol	\$$rot1[$j%4],$a
+#md5#	mov	`$j==15?"$c":"$b"`,$tmp		# forward reference
+#rc4#	pinsrw	\$`($j>>1)&7`,($dat,$TX[0],4),$xmm\n
+#md5#	add	$b,$a
+___
+    $code.=<<___ if ($rc4 && $j==15 && $k==$MOD-1);
+	mov	$YY,$XX[1]
+	xor	$YY,$YY				# keyword to partial register
+	mov	$XX[1]#b,$YY#b
+	lea	($dat,$XX[0],4),$XX[1]
+___
+    $code.=<<___ if ($rc4 && $j==15);
+	psllq	\$8,%xmm1
+	pxor	%xmm0,%xmm3
+	pxor	%xmm1,%xmm3
+___
+}
+sub R2 {
+  my ($i,$a,$b,$c,$d)=@_;
+  my @rot2=(4,11,16,23);
+  my $j=$i%16;
+  my $k=$i%$MOD;
+  my $xmm="%xmm".($j&1);
+    $code.="	movdqu	32($in0),%xmm4\n"	if ($rc4 && $j==15);
+    $code.="	add	\$$MOD,$XX[0]#b\n"	if ($rc4 && $j==15 && $k==$MOD-1);
+    $code.="	pxor	$xmm,$xmm\n"		if ($rc4 && $j<=1);
+    $code.=<<___;
+#rc4#	movl	($dat,$YY,4),$TY#d
+#md5#	xor	$c,$tmp
+#rc4#	movl	$TX[0]#d,($dat,$YY,4)
+#md5#	xor	$b,$tmp
+#md5#	add	4*`((5+3*$j)%16)`($inp),$a
+#rc4#	add	$TY#b,$TX[0]#b
+#rc4#	movl	`4*(($k+1)%$MOD)`(`$k==$MOD-1?"$dat,$XX[0],4":"$XX[1]"`),$TX[1]#d
+#md5#	add	\$$K[$i],$a
+#rc4#	movz	$TX[0]#b,$TX[0]#d
+#md5#	add	$tmp,$a
+#rc4#	movl	$TY#d,4*$k($XX[1])
+#rc4#	add	$TX[1]#b,$YY#b
+#md5#	rol	\$$rot2[$j%4],$a
+#md5#	mov	`$j==15?"\\\$-1":"$c"`,$tmp	# forward reference
+#rc4#	pinsrw	\$`($j>>1)&7`,($dat,$TX[0],4),$xmm\n
+#md5#	add	$b,$a
+___
+    $code.=<<___ if ($rc4 && $j==15 && $k==$MOD-1);
+	mov	$YY,$XX[1]
+	xor	$YY,$YY				# keyword to partial register
+	mov	$XX[1]#b,$YY#b
+	lea	($dat,$XX[0],4),$XX[1]
+___
+    $code.=<<___ if ($rc4 && $j==15);
+	psllq	\$8,%xmm1
+	pxor	%xmm0,%xmm4
+	pxor	%xmm1,%xmm4
+___
+}
+sub R3 {
+  my ($i,$a,$b,$c,$d)=@_;
+  my @rot3=(6,10,15,21);
+  my $j=$i%16;
+  my $k=$i%$MOD;
+  my $xmm="%xmm".($j&1);
+    $code.="	movdqu	48($in0),%xmm5\n"	if ($rc4 && $j==15);
+    $code.="	add	\$$MOD,$XX[0]#b\n"	if ($rc4 && $j==15 && $k==$MOD-1);
+    $code.="	pxor	$xmm,$xmm\n"		if ($rc4 && $j<=1);
+    $code.=<<___;
+#rc4#	movl	($dat,$YY,4),$TY#d
+#md5#	xor	$d,$tmp
+#rc4#	movl	$TX[0]#d,($dat,$YY,4)
+#md5#	or	$b,$tmp
+#md5#	add	4*`((7*$j)%16)`($inp),$a
+#rc4#	add	$TY#b,$TX[0]#b
+#rc4#	movl	`4*(($k+1)%$MOD)`(`$k==$MOD-1?"$dat,$XX[0],4":"$XX[1]"`),$TX[1]#d
+#md5#	add	\$$K[$i],$a
+#rc4#	movz	$TX[0]#b,$TX[0]#d
+#md5#	xor	$c,$tmp
+#rc4#	movl	$TY#d,4*$k($XX[1])
+#md5#	add	$tmp,$a
+#rc4#	add	$TX[1]#b,$YY#b
+#md5#	rol	\$$rot3[$j%4],$a
+#md5#	mov	\$-1,$tmp			# forward reference
+#rc4#	pinsrw	\$`($j>>1)&7`,($dat,$TX[0],4),$xmm\n
+#md5#	add	$b,$a
+___
+    $code.=<<___ if ($rc4 && $j==15);
+	mov	$XX[0],$XX[1]
+	xor	$XX[0],$XX[0]			# keyword to partial register
+	mov	$XX[1]#b,$XX[0]#b
+	mov	$YY,$XX[1]
+	xor	$YY,$YY				# keyword to partial register
+	mov	$XX[1]#b,$YY#b
+	lea	($dat,$XX[0],4),$XX[1]
+	psllq	\$8,%xmm1
+	pxor	%xmm0,%xmm5
+	pxor	%xmm1,%xmm5
+___
+}
+
+my $i=0;
+for(;$i<16;$i++) { R0($i,@V); unshift(@V,pop(@V)); push(@TX,shift(@TX)); }
+for(;$i<32;$i++) { R1($i,@V); unshift(@V,pop(@V)); push(@TX,shift(@TX)); }
+for(;$i<48;$i++) { R2($i,@V); unshift(@V,pop(@V)); push(@TX,shift(@TX)); }
+for(;$i<64;$i++) { R3($i,@V); unshift(@V,pop(@V)); push(@TX,shift(@TX)); }
+
+$code.=<<___;
+#md5#	add	0*4(%rsp),$V[0]		# accumulate hash value
+#md5#	add	1*4(%rsp),$V[1]
+#md5#	add	2*4(%rsp),$V[2]
+#md5#	add	3*4(%rsp),$V[3]
+
+#rc4#	movdqu	%xmm2,($out,$in0)	# write RC4 output
+#rc4#	movdqu	%xmm3,16($out,$in0)
+#rc4#	movdqu	%xmm4,32($out,$in0)
+#rc4#	movdqu	%xmm5,48($out,$in0)
+#md5#	lea	64($inp),$inp
+#rc4#	lea	64($in0),$in0
+	cmp	16(%rsp),$inp		# are we done?
+	jb	.Loop
+
+#md5#	mov	24(%rsp),$len		# restore pointer to MD5_CTX
+#rc4#	sub	$TX[0]#b,$YY#b		# correct $YY
+#md5#	mov	$V[0],0*4($len)		# write MD5_CTX
+#md5#	mov	$V[1],1*4($len)
+#md5#	mov	$V[2],2*4($len)
+#md5#	mov	$V[3],3*4($len)
+___
+$code.=<<___ if ($rc4 && (!$md5 || $D));
+	mov	32(%rsp),$len		# restore original $len
+	and	\$63,$len		# remaining bytes
+	jnz	.Loop1
+	jmp	.Ldone
+	
+.align	16
+.Loop1:
+	add	$TX[0]#b,$YY#b
+	movl	($dat,$YY,4),$TY#d
+	movl	$TX[0]#d,($dat,$YY,4)
+	movl	$TY#d,($dat,$XX[0],4)
+	add	$TY#b,$TX[0]#b
+	inc	$XX[0]#b
+	movl	($dat,$TX[0],4),$TY#d
+	movl	($dat,$XX[0],4),$TX[0]#d
+	xorb	($in0),$TY#b
+	movb	$TY#b,($out,$in0)
+	lea	1($in0),$in0
+	dec	$len
+	jnz	.Loop1
+
+.Ldone:
+___
+$code.=<<___;
+#rc4#	sub	\$1,$XX[0]#b
+#rc4#	movl	$XX[0]#d,-8($dat)
+#rc4#	movl	$YY#d,-4($dat)
+
+	mov	40(%rsp),%r15
+	mov	48(%rsp),%r14
+	mov	56(%rsp),%r13
+	mov	64(%rsp),%r12
+	mov	72(%rsp),%rbp
+	mov	80(%rsp),%rbx
+	lea	88(%rsp),%rsp
+.Lepilogue:
+.Labort:
+	ret
+.size $func,.-$func
+___
+
+if ($rc4 && $D) {	# sole purpose of this section is to provide
+			# option to use the generated module as drop-in
+			# replacement for rc4-x86_64.pl for debugging
+			# and testing purposes...
+my ($idx,$ido)=("%r8","%r9");
+my ($dat,$len,$inp)=("%rdi","%rsi","%rdx");
+
+$code.=<<___;
+.globl	RC4_set_key
+.type	RC4_set_key,\@function,3
+.align	16
+RC4_set_key:
+	lea	8($dat),$dat
+	lea	($inp,$len),$inp
+	neg	$len
+	mov	$len,%rcx
+	xor	%eax,%eax
+	xor	$ido,$ido
+	xor	%r10,%r10
+	xor	%r11,%r11
+	jmp	.Lw1stloop
+
+.align	16
+.Lw1stloop:
+	mov	%eax,($dat,%rax,4)
+	add	\$1,%al
+	jnc	.Lw1stloop
+
+	xor	$ido,$ido
+	xor	$idx,$idx
+.align	16
+.Lw2ndloop:
+	mov	($dat,$ido,4),%r10d
+	add	($inp,$len,1),$idx#b
+	add	%r10b,$idx#b
+	add	\$1,$len
+	mov	($dat,$idx,4),%r11d
+	cmovz	%rcx,$len
+	mov	%r10d,($dat,$idx,4)
+	mov	%r11d,($dat,$ido,4)
+	add	\$1,$ido#b
+	jnc	.Lw2ndloop
+
+	xor	%eax,%eax
+	mov	%eax,-8($dat)
+	mov	%eax,-4($dat)
+	ret
+.size	RC4_set_key,.-RC4_set_key
+
+.globl	RC4_options
+.type	RC4_options,\@abi-omnipotent
+.align	16
+RC4_options:
+	lea	.Lopts(%rip),%rax
+	ret
+.align	64
+.Lopts:
+.asciz	"rc4(64x,int)"
+.align	64
+.size	RC4_options,.-RC4_options
+___
+}
+# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
+#		CONTEXT *context,DISPATCHER_CONTEXT *disp)
+if ($win64) {
+my $rec="%rcx";
+my $frame="%rdx";
+my $context="%r8";
+my $disp="%r9";
+
+$code.=<<___;
+.extern	__imp_RtlVirtualUnwind
+.type	se_handler,\@abi-omnipotent
+.align	16
+se_handler:
+	push	%rsi
+	push	%rdi
+	push	%rbx
+	push	%rbp
+	push	%r12
+	push	%r13
+	push	%r14
+	push	%r15
+	pushfq
+	sub	\$64,%rsp
+
+	mov	120($context),%rax	# pull context->Rax
+	mov	248($context),%rbx	# pull context->Rip
+
+	lea	.Lbody(%rip),%r10
+	cmp	%r10,%rbx		# context->Rip<.Lbody
+	jb	.Lin_prologue
+
+	mov	152($context),%rax	# pull context->Rsp
+
+	lea	.Lepilogue(%rip),%r10
+	cmp	%r10,%rbx		# context->Rip>=.Lepilogue
+	jae	.Lin_prologue
+
+	mov	40(%rax),%r15
+	mov	48(%rax),%r14
+	mov	56(%rax),%r13
+	mov	64(%rax),%r12
+	mov	72(%rax),%rbp
+	mov	80(%rax),%rbx
+	lea	88(%rax),%rax
+
+	mov	%rbx,144($context)	# restore context->Rbx
+	mov	%rbp,160($context)	# restore context->Rbp
+	mov	%r12,216($context)	# restore context->R12
+	mov	%r13,224($context)	# restore context->R12
+	mov	%r14,232($context)	# restore context->R14
+	mov	%r15,240($context)	# restore context->R15
+
+.Lin_prologue:
+	mov	8(%rax),%rdi
+	mov	16(%rax),%rsi
+	mov	%rax,152($context)	# restore context->Rsp
+	mov	%rsi,168($context)	# restore context->Rsi
+	mov	%rdi,176($context)	# restore context->Rdi
+
+	mov	40($disp),%rdi		# disp->ContextRecord
+	mov	$context,%rsi		# context
+	mov	\$154,%ecx		# sizeof(CONTEXT)
+	.long	0xa548f3fc		# cld; rep movsq
+
+	mov	$disp,%rsi
+	xor	%rcx,%rcx		# arg1, UNW_FLAG_NHANDLER
+	mov	8(%rsi),%rdx		# arg2, disp->ImageBase
+	mov	0(%rsi),%r8		# arg3, disp->ControlPc
+	mov	16(%rsi),%r9		# arg4, disp->FunctionEntry
+	mov	40(%rsi),%r10		# disp->ContextRecord
+	lea	56(%rsi),%r11		# &disp->HandlerData
+	lea	24(%rsi),%r12		# &disp->EstablisherFrame
+	mov	%r10,32(%rsp)		# arg5
+	mov	%r11,40(%rsp)		# arg6
+	mov	%r12,48(%rsp)		# arg7
+	mov	%rcx,56(%rsp)		# arg8, (NULL)
+	call	*__imp_RtlVirtualUnwind(%rip)
+
+	mov	\$1,%eax		# ExceptionContinueSearch
+	add	\$64,%rsp
+	popfq
+	pop	%r15
+	pop	%r14
+	pop	%r13
+	pop	%r12
+	pop	%rbp
+	pop	%rbx
+	pop	%rdi
+	pop	%rsi
+	ret
+.size	se_handler,.-se_handler
+
+.section	.pdata
+.align	4
+	.rva	.LSEH_begin_$func
+	.rva	.LSEH_end_$func
+	.rva	.LSEH_info_$func
+
+.section	.xdata
+.align	8
+.LSEH_info_$func:
+	.byte	9,0,0,0
+	.rva	se_handler
+___
+}
+
+sub reg_part {
+my ($reg,$conv)=@_;
+    if ($reg =~ /%r[0-9]+/)     { $reg .= $conv; }
+    elsif ($conv eq "b")        { $reg =~ s/%[er]([^x]+)x?/%$1l/;       }
+    elsif ($conv eq "w")        { $reg =~ s/%[er](.+)/%$1/;             }
+    elsif ($conv eq "d")        { $reg =~ s/%[er](.+)/%e$1/;            }
+    return $reg;
+}
+
+$code =~ s/(%[a-z0-9]+)#([bwd])/reg_part($1,$2)/gem;
+$code =~ s/\`([^\`]*)\`/eval $1/gem;
+$code =~ s/pinsrw\s+\$0,/movd	/gm;
+
+$code =~ s/#md5#//gm	if ($md5);
+$code =~ s/#rc4#//gm	if ($rc4);
+
+print $code;
+
+close STDOUT;
diff --git a/tool/speed.cc b/tool/speed.cc
index 8dde777..9190110 100644
--- a/tool/speed.cc
+++ b/tool/speed.cc
@@ -281,6 +281,7 @@
   if (!SpeedAEAD(EVP_aead_aes_128_gcm(), "AES-128-GCM") ||
       !SpeedAEAD(EVP_aead_aes_256_gcm(), "AES-256-GCM") ||
       !SpeedAEAD(EVP_aead_chacha20_poly1305(), "ChaCha20-Poly1305") ||
+      !SpeedAEAD(EVP_aead_rc4_md5_tls(), "RC4-MD5") ||
       !SpeedHash(EVP_sha1(), "SHA-1") ||
       !SpeedHash(EVP_sha256(), "SHA-256") ||
       !SpeedHash(EVP_sha512(), "SHA-512")) {
diff --git a/util/all_tests.sh b/util/all_tests.sh
index 1396c8d..5bfad27 100644
--- a/util/all_tests.sh
+++ b/util/all_tests.sh
@@ -18,6 +18,7 @@
 ./crypto/cipher/aead_test aes-128-gcm ../crypto/cipher/aes_128_gcm_tests.txt
 ./crypto/cipher/aead_test aes-256-gcm ../crypto/cipher/aes_256_gcm_tests.txt
 ./crypto/cipher/aead_test chacha20-poly1305 ../crypto/cipher/chacha20_poly1305_tests.txt
+./crypto/cipher/aead_test rc4-md5 ../crypto/cipher/rc4_md5_tests.txt
 ./crypto/bio/bio_test
 ./crypto/bn/bn_test
 ./crypto/cipher/cipher_test ../crypto/cipher/cipher_test.txt