diff options
author | Adam Langley <agl@chromium.org> | 2014-06-25 04:26:59 +0400 |
---|---|---|
committer | Adam Langley <agl@google.com> | 2014-07-01 03:01:17 +0400 |
commit | 45ec21b99c144643dec9e953a3b8ba44870f5cac (patch) | |
tree | 1833a37a09d781ab6c02688934a5006e14a113e2 /crypto | |
parent | 5d17dd64ccff0b6840a0b673df29c97ec05be448 (diff) |
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>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/cipher/aead.h | 12 | ||||
-rw-r--r-- | crypto/cipher/aead_test.c | 20 | ||||
-rw-r--r-- | crypto/cipher/cipher.h | 5 | ||||
-rw-r--r-- | crypto/cipher/cipher_error.c | 5 | ||||
-rw-r--r-- | crypto/cipher/e_rc4.c | 282 | ||||
-rw-r--r-- | crypto/cipher/rc4_md5_tests.txt | 480 | ||||
-rw-r--r-- | crypto/rc4/CMakeLists.txt | 2 | ||||
-rw-r--r-- | crypto/rc4/asm/rc4-md5-x86_64.pl | 632 |
8 files changed, 1438 insertions, 0 deletions
diff --git a/crypto/cipher/aead.h b/crypto/cipher/aead.h index 24e8564d..767ab78b 100644 --- a/crypto/cipher/aead.h +++ b/crypto/cipher/aead.h @@ -102,6 +102,18 @@ const EVP_AEAD *EVP_aead_aes_256_gcm(void); 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 7e401475..516ec319 100644 --- a/crypto/cipher/aead_test.c +++ b/crypto/cipher/aead_test.c @@ -104,6 +104,15 @@ static int run_test_case(const EVP_AEAD *aead, 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 @@ static int run_test_case(const EVP_AEAD *aead, 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 @@ int main(int argc, char **argv) { 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 74f08efb..7d25005a 100644 --- a/crypto/cipher/cipher.h +++ b/crypto/cipher/cipher.h @@ -436,6 +436,9 @@ typedef struct evp_cipher_info_st { #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 @@ typedef struct evp_cipher_info_st { #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 ec53f16f..295b9613 100644 --- a/crypto/cipher/cipher_error.c +++ b/crypto/cipher/cipher_error.c @@ -31,6 +31,9 @@ const ERR_STRING_DATA CIPHER_error_string_data[] = { {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 @@ const ERR_STRING_DATA CIPHER_error_string_data[] = { {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 840855a0..df1bc11e 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 @@ static const EVP_CIPHER rc4 = { 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 00000000..3457e012 --- /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 00728321..9862af29 100644 --- a/crypto/rc4/CMakeLists.txt +++ b/crypto/rc4/CMakeLists.txt @@ -5,6 +5,7 @@ if (${ARCH} STREQUAL "x86_64") RC4_ARCH_SOURCES rc4-x86_64.${ASM_EXT} + rc4-md5-x86_64.${ASM_EXT} ) endif() @@ -26,4 +27,5 @@ add_library( ) 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 00000000..272fa91e --- /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; |